Come forzare la disinstallazione del servizio Windows


174

Ho installato un servizio Windows usando installUtil.exe.

Dopo aver aggiornato il codice ho usato di nuovo installUtil.exe per installare il servizio senza disinstallare prima la versione originale.

Quando provo ora a disinstallare il servizio, installUtil.exe completa la disinstallazione correttamente, ma il servizio appare ancora.

Se provo a modificarne le proprietà, ricevo il messaggio "il servizio è contrassegnato per l'eliminazione".

Come posso forzare la cancellazione (preferibilmente senza riavviare il server)?


Se il servizio è sospeso e la cancellazione non funziona, vedere Come forzare la disinstallazione del servizio Windows
Wernfried Domscheit

Risposte:


470

Una cosa che mi ha sorpreso in passato è che se hai il visualizzatore di servizi in esecuzione, ciò impedisce che i servizi vengano eliminati completamente, così vicini che in anticipo


70
Riesco a malapena a credere che avere lo spettatore aperto interrompa la rimozione del servizio - che stupido!
Draemon,

1
Questo è così stupido da parte di Microsoft, ma funziona davvero. Per qualche motivo inspiegabile, avere il visualizzatore di servizi aperto impedisce che a volte vengano eliminati correttamente.
Ivantod,

1
Penso che questa risposta avrà centinaia di commenti simili. Ho appena perso 30 minuti con questo stupido problema ...
PierrOz,

2
Sembra che SysInternals process explorer blocchi anche i servizi (e forse anche il task manager), quindi assicurati di chiudere anche quelli!
danio,

3
assicurati anche di usare il prompt cmd. PowerShell non mostra alcun errore, ma non elimina neanche.
Bruno Faria,

145

Non è necessario riavviare il computer. Avviare cmd o PowerShell in modalità elevata.

sc.exe queryex <SERVICE_NAME>

Quindi otterrai alcune informazioni. Verrà mostrato un numero PID.

taskkill /pid <SERVICE_PID> /f

Dove / f deve forzare l'arresto.

Ora puoi installare o avviare il tuo servizio.


2
Ha funzionato in modo massiccio dove tutto il resto tranne un riavvio non è riuscito - ben contento!
DaveF,

36
Questo non ha funzionato per me - il pid per il mio servizio ha restituito 0 e non mi avrebbe permesso di eliminare un processo di sistema critico.
plasma147

4
A + fantastico. Usa sc delete quindi quanto sopra.
Zone12

7
non ha funzionato come PID è arrivato a 0, questo ha risolto il mio problema - (SC) DeleteService FAILED 1072
Web-E

3
Assolutamente utile! Nel mio caso, a dir poco un riavvio ha funzionato. Nemmeno cancellando la directory di servizio nel registro! Un Gotcha però: se si lavora in uso PowerShell: sc.exe queryex <SERVICENAME>. Perché scè anche un alias per Set-Content, fallirà SILENTAMENTE quando lo usi.
Ifedi Okonkwo,

97

bene, puoi usare SC.EXE per eliminare forzatamente qualsiasi servizio di Windows se la disinstallazione non viene rimossa per caso.

sc delete <Service_Name>

Maggiori informazioni su "MS Techno Blogging" Eliminazione forzata dei servizi da MMC servizi


5
Grazie per questo. Notare che se il "Nome servizio" non è uguale al "Nome visualizzato", è possibile ottenere il "Nome servizio" nelle proprietà del servizio.
GuiSim,

8
sc deletesegnalerà inoltre "il servizio è contrassegnato per l'eliminazione" se è presente un handle aperto al servizio.
Matt,

@GuiSim grazie, sospetto che molti metteranno il nome visualizzato come me!
nik0lai,

Ci ho provato ma ho ricevuto questo messaggio: [SC] DeleteService FAILED 1072: il servizio specificato è stato contrassegnato per l'eliminazione.
Andrew W. Phillips,

37

So che questo non aiuterà, ma potrebbe aiutare qualcuno in futuro.

Ho appena avuto lo stesso problema, la chiusura e la riapertura del gestore servizi hanno rimosso sia la voce dal registro sia la disinstallazione del servizio.

In precedenza, l'aggiornamento del gestore dei servizi non aveva aiutato.


1
Grazie per essere intervenuto. La mia esperienza è stata esattamente come hai descritto.
pk.

10
sc delete sericeName

Assicurati solo che il servizio sia interrotto prima di farlo. Ho visto questo lavoro la maggior parte delle volte. Ci sono volte in cui ho visto Windows rimanere bloccato su qualcosa e insiste per un riavvio.


Solo un'aggiunta .. Ho dovuto eseguire il mio prompt dos / .NET prompt come amministratore per ottenere l'accesso per eseguire il comando sc delete .. nel caso in cui qualcun altro si imbatta in quel problema.
Dav.id,

Eseguire "NET STOP <serviceName>" prima di SC DELETE per assicurarsi che il servizio sia stato arrestato prima dell'eliminazione
Adi,

Anche questa è stata la mia esperienza, alla fine ho dovuto riavviare per rimuovere un servizio testardo che è stato disinstallato solo parzialmente (è ancora apparso nello snap-in con un codice 2). Il riavvio è stato ciò che alla fine lo ha fatto andare via.
delliottg


4

Sfortunatamente, è necessario riavviare il server. Ciò dovrebbe rimuovere il servizio "cancellato".


12
No. Non è necessario riavviare. Vedi la mia soluzione :)
johan,

2
In realtà mi piace ancora di più la soluzione di user186749. Bello e pulito.
McKay,

3

Nel caso in cui questa risposta aiuti qualcuno: come si trova qui , potresti risparmiare un sacco di problemi eseguendo Sysinternals Autoruns come amministratore. Vai alla scheda "Servizi" ed elimina il tuo servizio.

Ha funzionato per me su una macchina in cui non avevo il permesso di modificare il registro.


3

Puoi eliminare manualmente la chiave di registro per il tuo servizio, situata in HKLM\SYSTEM\CurrentControlSet\Services, dopodiché non vedrai il servizio in Gestione controllo servizi (è necessario aggiornare o riaprire per vedere la modifica) e puoi reinstallare il servizio come al solito.


Su Windows 2012 R2, lo snap-in MMC Servizi (Services.MSC) visualizza " Impossibile leggere la descrizione. Codice errore: 2 ". Nonostante la garanzia che tutti gli altri MMC siano stati chiusi e nessun altro utente abbia effettuato l'accesso.
Signal15

Vedo, testato solo su Windows 8 e Windows 10 (e ha funzionato).
Fernando Gonzalez Sanchez,

CHE finalmente risolto il mio problema. Ho dimenticato di aggiungere un programma di installazione del servizio nel progetto e non ho potuto rimuovere il mio servizio dopo l'installazione. Consiglio di fare un'esportazione dell'albero del registro di servizio prima di eliminare qualsiasi cosa al suo interno. Molte grazie!
user3772108

2

Di seguito funzionerà senza riavviare la macchina:

  1. Cerca nel Registro di sistema \ HKEY_LOCAL_MACHINE <Nome servizio> (sia chiavi che valori)
  2. Impostare il valore "Legacy" su 0

1

Hai provato a interrompere il servizio prima di chiamare la disinstallazione? Ho avuto questo problema in modo casuale. A volte potrei rimuoverlo senza riavviare. La mia ipotesi è che abbia a che fare con il servizio ancora in esecuzione


1

Sono in ritardo, ma vorrei aggiungere un'alternativa, che può sembrare strana, ma non ho visto un altro modo:

Mentre installo i miei servizi Windows in un processo di CI ogni notte, avevo bisogno di qualcosa che funzioni continuamente ed è completamente automatizzata. Per qualche motivo, i servizi sono stati sempre contrassegnati per l'eliminazione per un lungo periodo (5 minuti o più) dopo la disinstallazione. Pertanto, ho esteso lo script batch di reinstallazione per assicurarmi che il servizio sia veramente cancellato (versione semplificata):

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

Quello che posso vedere è che il servizio è contrassegnato per l'eliminazione per circa 5 minuti (!) Fino a quando non viene completato. Infine, non ho bisogno di altri interventi manuali. Estenderò la sceneggiatura in futuro in modo che qualcosa accada dopo un certo tempo (ad esempio notifica dopo 30 minuti).


1

Questo ha funzionato per me

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

Se il tuo output mostra che ReturnValue : 16, il comando non è riuscito con " Questo servizio viene rimosso dal sistema ". Elenco completo dei ReturnValues ​​di Microsoft qui
Signal15

1

Se non riesci a interrompere il servizio in Servizi , puoi interrompere il tuo servizio windows exe in Task Manager . Successivamente, è possibile rimuovere il servizio.


0

L'aggiornamento dell'elenco dei servizi lo ha sempre fatto per me. Se la finestra dei servizi è aperta, conterrà un po 'di memoria esistente per qualche motivo. F5 e sto reinstallando di nuovo!


0

Assicurati anche che non vi siano istanze dell'eseguibile ancora attive (forse una che potrebbe essere stata in esecuzione, per qualsiasi motivo, indipendentemente dal servizio).

Stavo aprendo e chiudendo MMC e cercavo i PID da uccidere, ma quando guardavo in explorer di processi c'erano un paio di processi esistenti in esecuzione da un batch pianificato dimenticato. Li ha uccisi. Lavoro fatto.


0

Ci sono molte domande sul forum in quell'argomento.

Ho trovato la risposta in Windows API. Non è necessario riavviare il computer dopo aver disinstallato il servizio. Devi chiamare:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Questo chiude l'handle del servizio. Su Windows 7 ha risolto il mio problema. Lo voglio:

  • interrompere il servizio
  • chiudere la maniglia
  • servizio di disinstallazione
  • attendere 3 sec
  • copia il nuovo exe nella directory
  • installa il servizio
  • avviare il servizio
  • chiudere la maniglia

2
Dove si chiude la maniglia se non si è nel programma con la maniglia aperta?
Matt,

0

Uso il seguente PowerShell messo insieme da alcuni punti per le nostre istanze di Octopus Deploy quando TopShelf incasina o un servizio fallisce per qualche altro motivo.

$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

Vale anche la pena notare che questo:

sc delete "ServiceName"

non funziona in PowerShell, sc è un alias per il cmdlet Set-Content in PowerShell. Devi fare:

sc.exe delete "ServiceName"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.