Comment forcer la désinstallation du service Windows


174

J'ai installé un service Windows en utilisant installUtil.exe.

Après avoir mis à jour le code, j'ai utilisé à nouveau installUtil.exe pour installer le service sans désinstaller d'abord la version d'origine.

Lorsque j'essaye maintenant de désinstaller le service, installUtil.exe termine la désinstallation avec succès, mais le service apparaît toujours.

Si j'essaie de modifier ses propriétés, je reçois le message «Le service est marqué pour suppression».

Comment puis-je forcer la suppression (de préférence sans redémarrer le serveur)?


Si le service se bloque et que la suppression ne fonctionne pas, voir Comment forcer la désinstallation du service Windows
Wernfried Domscheit

Réponses:


470

Une chose qui m'a surpris dans le passé est que si vous avez la visionneuse de services en cours d'exécution, cela empêche les services d'être complètement supprimés, alors fermez-le au préalable


70
J'ai du mal à croire qu'ouvrir le téléspectateur pour interrompre la suppression du service - quelle stupidité!
Draemon

1
C'est tellement stupide de la part de Microsoft, mais cela fonctionne en effet. Pour une raison inexplicable, l'ouverture de la visionneuse de services empêche parfois leur suppression correcte.
ivantod

1
Je pense que cette réponse va avoir des centaines de commentaires similaires. Je viens de perdre 30min avec ce problème stupide ...
PierrOz

2
Il semble que l'explorateur de processus SysInternals verrouille également les services (et peut-être aussi le gestionnaire de tâches), alors assurez-vous de les fermer aussi!
danio

3
assurez-vous également d'utiliser l'invite cmd. PowerShell n'affiche aucune erreur, mais ne supprime pas non plus.
Bruno Faria

145

Vous n'avez pas besoin de redémarrer votre machine. Démarrez cmd ou PowerShell en mode élevé.

sc.exe queryex <SERVICE_NAME>

Ensuite, vous obtiendrez des informations. Un numéro PID s'affiche.

taskkill /pid <SERVICE_PID> /f

Où / f est de forcer l'arrêt.

Vous pouvez maintenant installer ou lancer votre service.


2
A fonctionné à merveille là où tout le reste a échoué, sauf un redémarrage, bien heureux!
DaveF

36
Cela n'a pas fonctionné pour moi - le pid de mon service a renvoyé 0 et il ne m'a pas permis de supprimer un processus système critique.
plasma147

4
A + génial. Utilisez sc delete puis ce qui précède.
Zone12

7
n'a pas fonctionné car le PID est venu à 0, cela a résolu mon problème - (SC) DeleteService FAILED 1072
Web-E

3
Absolument utile! Dans mon cas, rien de moins qu'un redémarrage a fonctionné. Pas même la suppression du répertoire de services dans le registre! Un Gotcha si: Si vous travaillez dans l' utilisation PowerShell: sc.exe queryex <SERVICENAME>. Parce que scc'est aussi un alias pour Set-Content, il échouera SILENCIEUSEMENT lorsque vous l'utiliserez.
Ifedi Okonkwo

97

eh bien, vous pouvez utiliser SC.EXE pour supprimer de force n'importe quel service Windows si la désinstallation ne supprime pas par hasard.

sc delete <Service_Name>

En savoir plus sur "MS Techno Blogging" Suppression forcée des services des services MMC


5
Merci pour cela. Notez que si le "Nom du service" n'est pas le même que le "Nom d'affichage", vous pouvez obtenir le "Nom du service" dans les propriétés du service.
GuiSim

8
sc deletesignalera également "le service est marqué pour suppression" s'il y a un handle ouvert au service.
Matt

@GuiSim merci pour cela, je soupçonne que beaucoup mettront le nom d'affichage comme je l'étais!
nik0lai

J'ai essayé mais j'ai reçu ce message: [SC] DeleteService FAILED 1072: Le service spécifié a été marqué pour suppression.
Andrew W. Phillips

37

Je sais que cela n'aidera pas, mais cela pourrait aider quelqu'un à l'avenir.

J'ai juste eu le même problème, la fermeture et la réouverture du gestionnaire de services ont supprimé à la fois l'entrée du registre et terminé la désinstallation du service.

Avant cela, rafraîchir le gestionnaire des services n'avait pas aidé.


1
Merci de votre participation. Mon expérience a été exactement comme vous l'avez décrite.
pk.

10
sc delete sericeName

Assurez-vous simplement que le service est arrêté avant de faire cela. J'ai vu ce travail la plupart du temps. Il y a des moments où j'ai vu des fenêtres se coincer sur quelque chose et cela insiste sur un redémarrage.


Juste un ajout ... J'ai dû exécuter mon invite dos / .NET en tant qu'administrateur pour avoir accès à la commande sc delete .. juste au cas où quelqu'un d'autre rencontrerait ce problème.
Dav.id

Exécutez "NET STOP <serviceName>" avant SC DELETE pour vous assurer que le service a été arrêté avant la suppression
Adi

C'était aussi mon expérience, j'ai finalement dû redémarrer pour supprimer un service têtu qui n'était que partiellement désinstallé (il apparaissait toujours dans le composant logiciel enfichable avec un code 2). Le redémarrage est ce qui l'a finalement fait disparaître.
delliottg


4

Malheureusement, vous devez redémarrer le serveur. Cela devrait supprimer le service "supprimé".


12
Non, vous n'avez pas besoin de redémarrer. Voir ma solution :)
johan

2
J'aime encore mieux la solution de user186749. Agréable et propre.
McKay

3

Juste au cas où cette réponse aiderait quelqu'un: comme trouvé ici , vous pourriez vous éviter beaucoup de problèmes pour exécuter Sysinternals Autoruns tant qu'administrateur. Allez simplement dans l'onglet "Services" et supprimez votre service.

Cela a fait l'affaire pour moi sur une machine sur laquelle je n'avais aucune autorisation pour modifier le registre.


3

Vous pouvez supprimer manuellement la clé de registre de votre service, située à l'adresse HKLM\SYSTEM\CurrentControlSet\Services , après cela, vous ne verrez pas le service dans le gestionnaire de contrôle de service (vous devez actualiser ou rouvrir pour voir la modification), et vous pouvez réinstaller le service comme d'habitude.


Sous Windows 2012 R2, le composant logiciel enfichable MMC Services (Services.MSC) affiche « Échec de lecture de la description. Code d'erreur: 2 ». Bien que tous les autres MMC soient fermés et qu'aucun autre utilisateur ne se soit connecté.
Signal15

Je vois, testé uniquement sous Windows 8 et Windows 10 (et cela a fonctionné).
Fernando Gonzalez Sanchez

CELA a finalement résolu mon problème. J'ai oublié d'ajouter un programme d'installation de service dans le projet et je n'ai pas pu supprimer mon service après l'installation. Je recommande de faire une exportation de l'arborescence d'enregistrement des services avant de supprimer quoi que ce soit. Merci beaucoup!
user3772108

2

Ce qui suit fonctionnera sans redémarrer la machine:

  1. Recherchez dans Registry \ HKEY_LOCAL_MACHINE <votre nom de service> (à la fois les clés et les valeurs)
  2. Définissez la valeur "Legacy" sur 0

1

Avez-vous essayé d'arrêter le service avant d'appeler la désinstallation? J'ai eu ce problème au hasard. Parfois, je pourrais le supprimer sans redémarrer. Je suppose que cela a à voir avec le service toujours en cours d'exécution


1

Je suis en retard, mais j'aimerais ajouter une alternative, qui peut paraître étrange, mais je n'ai pas vu d'autre moyen:

Comme j'installe mes services Windows dans un processus CI chaque nuit, j'avais besoin de quelque chose qui fonctionne tout le temps et qui est complètement automatisé. Pour une raison quelconque, les services étaient toujours marqués pour suppression pendant une longue période (5 minutes ou plus) après leur désinstallation. Par conséquent, j'ai étendu le script batch de réinstallation pour m'assurer que le service est vraiment supprimé (version simplifiée):

REM Stop the service first
net stop My-Socket-Server

REM Same as installutil.exe, just implemented in the service
My.Socket.Server.exe /u

:loop1
    REM Easy way to wait for 5 seconds
    ping 192.0.2.2 -n 1 -w 5000 > nul
    sc delete My-Socket-Server
    echo %date% %time%: Trying to delete service.
    if errorlevel 1072 goto :loop1

REM Just for output purposes, typically I get that the service does not exist
sc query My-Socket-Server

REM Installing the new service, same as installutil.exe but in code
My.Socket.Server.exe /i

REM Start the new service
net start My-Socket-Server

Ce que je peux voir, c'est que le service est marqué pour suppression pendant environ 5 minutes (!) Jusqu'à ce qu'il passe enfin. Enfin, je n'ai plus besoin d'interventions manuelles. Je vais étendre le script à l'avenir pour que quelque chose se passe après un certain temps (par exemple, notification après 30 minutes).


1

Cela a fonctionné pour moi

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()

Si votre sortie de cela montre ReturnValue : 16, alors la commande a échoué avec " Ce service est en cours de suppression du système ". Liste complète des ReturnValues ​​de Microsoft ici
Signal15

1

Si vous ne pouvez pas arrêter le service dans Services , vous pouvez arrêter votre exe de service Windows dans le Gestionnaire des tâches . Après cela, vous pouvez supprimer le service.


0

L'actualisation de la liste des services l'a toujours fait pour moi. Si la fenêtre des services est ouverte, elle conservera une partie de la mémoire existante pour une raison quelconque. F5 et je réinstalle à nouveau!


0

Assurez-vous également qu'aucune instance de l'exécutable n'est toujours active (peut-être une instance qui aurait pu être en cours d'exécution, pour une raison quelconque, indépendamment du service).

J'ouvrais et fermais MMC et cherchais les PID à tuer - mais en regardant dans l'explorateur de processus, il y avait quelques processus existants exécutés à partir d'un lot planifié oublié. Les tués. Travail accompli.


0

Il y a beaucoup de questions de forum sur ce sujet.

J'ai trouvé la réponse dans l'API de Windows. Vous n'avez pas besoin de redémarrer l'ordinateur après avoir désinstallé le service. Vous devez appeler:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Cela ferme la poignée du service. Sur Windows 7, cela a résolu mon problème. Je fais:

  • aire d'autoroute
  • fermer la poignée
  • désinstaller le service
  • attendre 3 sec
  • copier le nouvel exe dans le répertoire
  • installer le service
  • démarrer le service
  • fermer la poignée

2
Où obtenez-vous la poignée pour fermer si vous n'êtes pas dans le programme qui a la poignée ouverte?
Matt

0

J'utilise le PowerShell suivant bricolé à partir de quelques endroits pour nos instances Octopus Deploy lorsque TopShelf se trompe ou qu'un service échoue pour une autre raison.

$ServiceName = 'MyNaughtyService'
$ServiceName | Stop-Service -ErrorAction SilentlyContinue
# We tried nicely, now KILL!!!
$ServiceNamePID = Get-Service | Where { $_.Name -eq $ServiceName} # If it was hung($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and
$ServicePID = (Get-WmiObject Win32_Service | Where {$_.Name -eq $ServiceNamePID.Name}).ProcessID
Stop-Process $ServicePID -Force

0

Il convient également de noter que ceci:

sc delete "ServiceName"

ne fonctionne pas dans PowerShell, sc est un alias pour l'applet de commande Set-Content dans PowerShell. Tu as besoin de faire:

sc.exe delete "ServiceName"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.