Comment résoudre l'erreur «Le service spécifié a été marqué pour suppression»

584

J'essaie de supprimer un service Windows avec sc delete <service name>et rencontre l'erreur suivante:

[SC] DeleteService FAILED 1072:

Le service spécifié a été marqué pour suppression.

Ce que j'ai déjà fait:

Le problème persiste.

Quelle est la prochaine étape?

Arseni Mourzenko
la source
4
Un redémarrage devrait normalement effacer tout état persistant.
Damien_The_Unbeliever
14
Je connais. Mais j'ai pensé à une solution moins radicale. Redémarrer trente fois par jour ne sera pas une solution acceptable dans mon cas.
Arseni Mourzenko
54
"pourquoi supprimez-vous ces services régulièrement?" : J'écris un service Windows. Chaque fois qu'il est compilé, il doit être redémarré. "Pourtant, pirater le registre 30 fois par jour est acceptable?" : totalement. La suppression d'une clé du registre ne m'oblige pas à tout enregistrer, à fermer toutes les applications ouvertes, à attendre une minute, puis à tout rouvrir.
Arseni Mourzenko
46
J'ai écrit des services Windows. À moins que vous ne changiez le code réel qui effectue l'enregistrement, il n'est pas nécessaire de le désinstaller et de le réinstaller à chaque fois que vous effectuez une génération. Tant que le chemin est toujours le même, les informations d'enregistrement plus anciennes seront toujours valides.
Damien_The_Unbeliever
4
@NickTurner - lien vers un rapport de bogue? Quel que soit le bug dont vous parlez, je ne l'ai pas rencontré. Et je ne sais pas comment un MSI est impliqué, car nous parlons vraisemblablement de la création et de l'exécution de services sur une machine de développement (cela semble au moins être le contexte de cette question vieille de 5 ans)
Damien_The_Unbeliever

Réponses:

1245

Il peut y avoir plusieurs causes qui conduisent au blocage du service «marqué pour suppression».

  1. L'Explorateur de processus de SysInternals est ouvert . La fermeture devrait entraîner la suppression automatique du service.

  2. Le Gestionnaire des tâches est ouvert .

  3. La console Microsoft Management Console (MMC) est ouverte . Pour vous assurer que toutes les instances sont fermées, exécutez taskkill /F /IM mmc.exe.

  4. La console des services est ouverte . Ceci est identique au point précédent, car la console des services est hébergée par MMC.

  5. L'Observateur d'événements est ouvert . Encore une fois, c'est la même chose que le troisième point.

  6. La clé HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {nom du service} existe .

  7. Quelqu'un d'autre est connecté au serveur et l'une des applications susmentionnées est ouverte.

  8. Une instance de Visual Studio utilisée pour déboguer le service est ouverte.

Arseni Mourzenko
la source
9
Le gestionnaire de tâches semble faire de même. Et comme indiqué ci-dessous, laisser la console des services ouverte pourrait également en être la cause.
CodingBarfield
4
... et si la fermeture de tout cela n'aide toujours pas et que vous voyez toujours le service comme "marqué pour suppression", déconnectez-vous simplement au lieu de redémarrer complètement. cela m'a aidé plusieurs fois.
Nedko
2
Un flux de travail commun: vos collègues infâmes sont également connectés au serveur distant, et ils ont tous quelque chose d'ouvert ...
Chris O
72
La fermeture de la console des services a résolu ce problème pour moi! Mon processus était le suivant: Dans l'invite de commande des outils natifs VS2012 x64 -> Accédez au répertoire avec le service exectuable -> installutil / u nomservice.exe (pour désinstaller le service obsolète) -> copiez sur le nouveau fichier exe du service intégré - > installutil servicename.exe (pour installer le service mis à jour) . Je peux généralement désinstaller et réinstaller immédiatement sans aucun problème. Jusqu'à ce que je ne puisse pas au hasard. La fermeture de la console de services l'a résolu. Merci pour le conseil!
thehelix
17
Process Explorer est le grand ici, à mon avis. Je suggère de le mettre en gras et / ou de le déplacer en haut de la liste.
Coxy
224

Cela peut également être dû au fait que la console des services est ouverte. Windows ne supprimera pas réellement le service tant qu'il ne sera pas fermé.

forcé
la source
3
Comme je l'ai indiqué dans ma question, «Microsoft Management Console est fermée» pendant les tests.
Arseni Mourzenko
25
Dans mon cas, la console Services était le problème. Dès que je l'ai fermé et rouvert, les services supprimés ont disparu.
Farrukh Najmi
3
Difficile de croire que garder la fenêtre ouverte était le cas ... Merci!
Karol Tyl
Cela a également fonctionné pour moi, même si étrangement il y a eu de nombreux cas où une simple pression sur F5 rafraîchira la liste avec le service supprimé.
Steve Smith
1
Vous m'avez sauvé la journée
Pranoy Sarkar
50

J'ai eu le même problème, j'ai finalement décidé de tuer le processus de service.

pour cela, essayez les étapes ci-dessous:

  • obtenir l'identifiant de processus du service avec

    sc queryex <service name>

  • tuer le processus avec

    taskkill /F /PID <Service PID>

Ali Sadri
la source
2
mon PID est 0 donc je ferais mieux de ne pas tuer ça!
voler
vous pouvez désinstaller le service pour cela faire ci-dessous les étapes 1- exécuter cmd 2- changer de direction vers le fichier .exe de votre service localiser cela 3- exécuter la commande installutil / u <votre nom de fichier.exe>
Ali Sadri
+1 pour sc queryex Je pourrai l'utiliser pour obtenir le PID si je veux attacher le débogueur
Paul McCarthy
44

Dans mon cas, cela a fonctionné après la fermeture du Services. Vérifiez si le Services.mscest ouvert, si oui, fermez-le et vérifiez que tout processus de service se trouve dans Task Manager.

Sumit Agrawal
la source
13

Cela signifie que le service est toujours répertorié comme désactivé dans services.msc. Fermez simplement le services.msc et rouvrez-le en tant qu'administrateur ... Le service ne sera pas répertorié. Maintenant, installez le service à l'aide de la commande,

installutil "chemin de service"

Amey P Naik
la source
11

La suppression des clés de registre comme suggéré ci-dessus a bloqué mon service dans l'état d'arrêt. La procédure suivante a fonctionné pour moi:

ouvrir le gestionnaire de tâches> sélectionner l'onglet des services> sélectionner le service> cliquer avec le bouton droit et sélectionner "aller au processus"> cliquer avec le bouton droit sur le processus et sélectionner Terminer le processus

Le service devrait disparaître après cela

mathart63
la source
7

J'ai découvert une dernière chose à vérifier - regardez dans le Gestionnaire des tâches - si d'autres utilisateurs sont connectés à cette case, même s'ils sont «déconnectés», vous devez les déconnecter pour que le service soit finalement supprimé.

Kathy Gryta
la source
4
Inutile. Vous devez simplement vous assurer que tout le monde quitte le panneau de configuration Microsoft Management Console (MMC) et Services.
Marquis de Lorne le
6

Il semble que sur les versions de Windows ultérieures à Windows 7 (non vérifiées, mais par expérience récente avec Windows Server 2012 R2), le Gestionnaire de contrôle des services (SCM) est plus strict.

Alors que sur Windows 7, il lance simplement un autre processus, il vérifie maintenant si le processus de service est toujours là et peut retourner ERROR_SERVICE_MARKED_FOR_DELETE (1072) pour tout appel ultérieur à CreateService / DeleteService même si le service semble être arrêté.

Je parle du code API Windows ici, mais je veux décrire clairement ce qui se passe, donc cette séquence peut conduire à l'erreur mentionnée:

SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);

SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state

DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;

// any further calls to CreateService/DeleteService will fail
// if service process is still around

La raison pour laquelle un processus de service existe toujours après avoir déjà signalé son état SERVICE_STOPPED n'est pas surprenante. C'est un processus régulier, dont le thread principal est «bloqué» dans son appel à l' StartServiceCtrlDispatcherAPI, il réagit donc d'abord à une action de contrôle d'arrêt, mais doit ensuite exécuter sa séquence de code restante.

Il est regrettable que le SCM / OS ne gère pas cela correctement pour nous. Une solution programmatique est un peu simple et précise: obtenez le descripteur de processus de l'exécutable de service avant d'arrêter le service, puis attendez que ce descripteur soit signalé.

Si vous abordez le problème du point de vue de l'administration système, la solution consiste également à attendre que le processus de service disparaisse complètement.

klaus triendl
la source
6

C'est ce qui a fonctionné pour moi: - J'ai rencontré le même problème: mon service était coincé dans "marqué pour suppression". - J'ai ouvert services.msc Mon service s'est affiché comme étant en cours d'exécution, bien qu'il ait déjà été désinstallé. - J'ai cliqué sur Arrêter la réception d'un message d'erreur, indiquant que le service n'est pas en état de recevoir des messages de contrôle. Néanmoins, le service a été interrompu. - Services fermés.msc. - Services.msc rouverts. - Le service était parti (n'apparaissant plus dans la liste des services).

(L'environnement était Windows 7.)

balintn
la source
2
Windows 2008 ici, je devais juste fermer le panneau des services
Mathijs Segers
5

Dans mon cas, j'exécute taskkill /f /im dongleserver.exe, oùdongleserver.exe est le fichier exe de mon programme.

Ensuite, je peux déjà réinstaller mon programme.

Sian Chiew See
la source
4

Dans mon cas, cela a été causé par une exception non gérée lors de la création de la source eventLog. Utilisez try catch pour identifier la cause.

Arijus Gilbrantas
la source
4

La fermeture de chaque fenêtre actuellement ouverte suivie de l'exécution de la commande suivante a résolu le problème pour moi:

taskkill /F /IM mmc.exe
Tshilidzi Mudau
la source
3

La fermeture de la console des services comme suggéré par quelques-unes des réponses ici m'a permis de supprimer le service. Dans mon scénario, ce n'était qu'un correctif à court terme, car toutes les réinstallations et suppressions du service ultérieur m'obligeraient à prendre ces mesures supplémentaires. En examinant mon fichier web.config, il a été découvert qu'il y avait une erreur qui, une fois corrigée, m'a permis de supprimer facilement le service sans la fermeture supplémentaire de l'étape de la console des services.

GatesReign
la source
1

Cela fonctionne pour moi.

  • Ouvrez le Gestionnaire des tâches
  • Sélectionnez l'onglet services
  • Sélectionnez le service concerné
  • Faites un clic droit et sélectionnez "Aller aux détails"
  • Faites un clic droit sur le service et sélectionnez "Fin de l'arborescence des processus"

L'arborescence de processus de fin mettra fin au processus et à tous les processus créés par le processus.

Ensuite, vous pouvez réinstaller le service.

OIbuoye
la source
1

Dans mon cas, le nom du service était 'Monitor' qui est également utilisé par un service Windows appelé 'Monitor', lorsque j'ai essayé de mettre à jour mes services, j'ai essayé de les désinstaller, le programme d'installation a essayé de supprimer le service Windows 'Monitor' qu'il n'a pas pu, et l'installation a toujours été annulée.

J'ai fini par renommer mon service en quelque chose d'autre

Yaman
la source
0

Si les étapes fournies par @MainMa n'ont pas fonctionné, suivez les étapes suivantes

Étape 1 Essayez de tuer le processus à partir du gestionnaire de tâches Windows ou d'utiliser taskkill / F / PID. Vous pouvez trouver le pid du processus par la commande 'sc queryex'. Essayez l'étape suivante si vous ne pouvez toujours pas désinstaller.

Étape 2 Si ci-dessus

Exécutez Autoruns pour Windows Recherchez le service par nom et supprimez les résultats.

Charith
la source
0

La principale raison de l'erreur est que le processus n'est pas arrêté. pour le résoudre, lancez le gestionnaire de tâches, accédez aux services et voyez si vous pouvez toujours voir votre service, puis passez au processus de ce service et terminez le processus. Que le problème sera résolu complètement.

Gaurav Tyagi
la source
0

J'avais ce problème lorsque j'utilisais Application Verifier pour vérifier mon service Win. Même après avoir fermé App Ver, mon service n'a pas pu être supprimé. Seule la suppression du service d'App Ver a résolu le problème et le service a été supprimé immédiatement. Il semble qu'un processus utilise toujours votre service après que vous ayez essayé d'en supprimer un.

vadzvnik
la source
0

étapes à suivre:

étape 1 l'emplacement C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

étape 2 exécuter la commande: installutil / u chemin-complet / nomservice.exe

étape 3 fermez le panneau de services et rouvrez-le

étape-4 exécuter la commande: installutil full-path / servicename.exe

Divyang Shah
la source
1
une note latérale: installutil fonctionne UNIQUEMENT en tant qu'administrateur, alors ouvrez un shell en tant qu'administrateur.
ingconti
0

La suppression du service échoue très probablement car

protected override void OnStop()

jeter une erreur lors de l'arrêt d'un service. envelopper les choses dans une prise d'essai empêchera la marque d'erreur de suppression

protected override void OnStop()
{
            try
            {
                //things to do
            }
            catch (Exception)
            {
            }

}

e03050
la source
0

Parfois, cela peut se produire lors de la suppression du service via le script de session à distance PowerShell, en particulier lorsque vous essayez de supprimer le service plusieurs fois. Dans ce cas, essayez de recréer une session avant la suppression:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Alex Podles
la source