Come risolvere l'errore "Il servizio specificato è stato contrassegnato per l'eliminazione"


584

Provo a rimuovere un servizio Windows con sc delete <service name>e riscontro il seguente errore:

[SC] DeleteService FAILED 1072:

Il servizio specificato è stato contrassegnato per l'eliminazione.

Cosa ho già fatto:

Il problema persiste.

Qual'è il prossimo passo?


4
Un riavvio dovrebbe normalmente cancellare qualsiasi stato persistente.
Damien_The_Unbeliever il

14
Lo so. Ma ho pensato a una soluzione meno radicale. Il riavvio di trenta volte al giorno non sarà una soluzione accettabile nel mio caso.
Arseni Mourzenko,

54
"perché stai eliminando i servizi regolarmente?" : Sto scrivendo un servizio di Windows. Ogni volta che viene compilato, dovrebbe essere riavviato. "E 'accettabile hackerare nel registro 30 volte al giorno?" : totalmente. Rimuovere una chiave dal registro non mi costringe a salvare tutto, chiudere tutte le app aperte, attendere un minuto, quindi riaprire tutto.
Arseni Mourzenko,

46
Ho scritto servizi Windows. A meno che non si modifichi il codice effettivo che esegue la registrazione, non è necessario disinstallarlo e reinstallarlo ogni volta che si esegue una compilazione. Finché il percorso è sempre lo stesso, le informazioni di registrazione più vecchie saranno comunque valide.
Damien_The_Unbeliever,

4
@NickTurner - link a qualsiasi segnalazione di bug? Qualunque bug ti riferisca, non ho riscontrato. E non sono sicuro di come sia coinvolto un MSI poiché presumibilmente stiamo parlando di costruzione e gestione di servizi su una macchina di sviluppo (che almeno sembra essere il contesto di questa domanda di 5 anni)
Damien_The_Unbeliever

Risposte:


1245

Potrebbero esserci diverse cause che portano al blocco del servizio in "contrassegnato per l'eliminazione".

  1. Viene aperto Process Explorer di SysInternals . La sua chiusura dovrebbe comportare la rimozione automatica del servizio.

  2. Task Manager è aperto .

  3. Microsoft Management Console (MMC) è aperto . Per assicurarsi che tutte le istanze siano chiuse, eseguire taskkill /F /IM mmc.exe.

  4. La console dei servizi è aperta . È lo stesso del punto precedente, poiché la console dei servizi è ospitata da MMC.

  5. Il Visualizzatore eventi è aperto . Ancora una volta, questo è lo stesso del terzo punto.

  6. La chiave HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {nome servizio} esiste .

  7. Qualcun altro ha effettuato l'accesso al server e ha aperto una delle applicazioni menzionate in precedenza.

  8. Un'istanza di Visual Studio utilizzata per il debug del servizio è aperta.


9
Il Task Manager sembra fare lo stesso. E come indicato di seguito lasciare aperta la console dei servizi potrebbe causare questo.
CodingBarfield

4
... e se la chiusura di tutto ciò non è ancora utile e il servizio viene ancora visualizzato come "contrassegnato per l'eliminazione", eseguire la disconnessione semplice anziché il riavvio completo. mi ha aiutato alcune volte.
Nedko,

2
Un flusso di lavoro comune: anche i tuoi colleghi malvagi sono connessi al server remoto e hanno tutti qualcosa di aperto ...
Chris O

72
La chiusura della console dei servizi ha risolto questo problema per me! Il mio processo è stato il seguente: Nel prompt dei comandi degli strumenti nativi VS2012 x64 -> Naviga nella directory con servizio eseguibile -> installutil / u servicename.exe (per disinstallare il servizio obsoleto) -> copia su un nuovo exe di servizio integrato - > installutil servicename.exe (per installare il servizio aggiornato) . In genere posso disinstallare e reinstallare immediatamente senza problemi. Fino a quando non posso casualmente. La chiusura della console dei servizi l'ha risolto. Grazie per il consiglio!
thehelix,

17
Secondo me, Process Explorer è il più grande qui. Suggerisco di metterlo in grassetto e / o spostarlo in cima all'elenco.
Coxy,

224

Ciò può anche essere causato lasciando aperta la console dei servizi. Windows non eliminerà effettivamente il servizio fino alla sua chiusura.


3
Come ho indicato nella mia domanda, "Microsoft Management Console è chiusa" durante i test.
Arseni Mourzenko,

25
Nel mio caso la console dei servizi era il problema. Non appena l'ho chiuso e riaperto, i servizi eliminati sono andati via.
Farrukh Najmi,

3
Difficile credere che tenere la finestra aperta fosse il caso ... Grazie!
Karol Tyl,

Questo ha funzionato anche per me, anche se stranamente ci sono stati molti casi in cui semplicemente premendo F5 si aggiorna l'elenco con il servizio rimosso.
Steve Smith,

1
Mi hai salvato la giornata
Pranoy Sarkar l'

50

Ho avuto lo stesso problema, finalmente decido di interrompere il processo di servizio.

per provare qui sotto:

  • ottenere l'ID di processo del servizio con

    sc queryex <service name>

  • uccidi processo con

    taskkill /F /PID <Service PID>


2
il mio PID è 0, quindi è meglio non ucciderlo!
rapina il

puoi disinstallare il servizio per farlo sotto i passaggi 1- esegui cmd 2- cambia direzione nel file .exe del tuo servizio individua che 3- esegui il comando installutil / u <yourfilename.exe>
Ali Sadri

+1 per sc queryex Potrò usarlo per ottenere il PID se voglio collegare il debugger
Paul McCarthy,

44

Nel mio caso ha funzionato dopo aver chiuso il Services. Controlla se Services.mscè aperto, in caso affermativo chiudilo e controlla se si trova qualsiasi processo di servizio Task Manager.


13

Ciò significa che il servizio è ancora elencato come disabilitato in services.msc. Basta chiudere services.msc e riaprirlo come amministratore ... Il servizio non verrà elencato. Ora installa il servizio usando il comando,

installutil "percorso di servizio"


11

L'eliminazione delle chiavi di registro come suggerito sopra ha bloccato il mio servizio nello stato di arresto. La seguente procedura ha funzionato per me:

apri il task manager> seleziona la scheda servizi> seleziona il servizio> fai clic destro e seleziona "vai al processo"> fai clic destro sul processo e seleziona Termina processo

Il servizio dovrebbe essere andato dopo quello


7

Ho scoperto un'altra cosa da controllare - guarda nel Task manager - se altri utenti sono connessi a questa casella, anche se sono "disconnessi" devi effettivamente disconnetterli per ottenere il servizio per eliminare definitivamente.


4
Non necessario. Devi solo assicurarti che tutti escano da Microsoft Management Console (MMC) e dal pannello di controllo dei servizi.
Marchese di Lorne,

6

Sembra che su versioni di Windows successive a Windows 7 (non verificato, ma per esperienza più recente con Windows Server 2012 R2), Service Control Manager (SCM) è più rigoroso.

Mentre su Windows 7 genera un altro processo, ora sta verificando se il processo di servizio è ancora in corso e potrebbe restituire ERROR_SERVICE_MARKED_FOR_DELETE (1072) per qualsiasi chiamata successiva a CreateService / DeleteService anche se il servizio sembra essere stato arrestato.

Sto parlando del codice API di Windows qui, ma voglio delineare chiaramente cosa sta succedendo, quindi questa sequenza può portare all'errore citato:

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

Il motivo per cui un processo di servizio è ancora presente dopo che ha già segnalato il suo stato SERVICE_STOPPED non è sorprendente. È un processo regolare, il cui thread principale è "bloccato" nella sua chiamata StartServiceCtrlDispatcherall'API, quindi prima reagisce a un'azione di controllo di arresto, ma poi deve eseguire la sequenza di codice rimanente.

È un po 'sfortunato che SCM / OS non lo gestisca correttamente per noi. Una soluzione programmatica è in qualche modo semplice e accurata: ottenere l'handle di processo dell'eseguibile del servizio prima di interrompere il servizio, quindi attendere che venga segnalato questo handle.

Se si affronta il problema dal punto di vista dell'amministrazione del sistema, la soluzione è anche attendere che il processo di servizio scompaia completamente.


6

Questo è ciò che ha funzionato per me: - Ho riscontrato lo stesso problema: il mio servizio era bloccato in "contrassegnato per l'eliminazione". - Ho aperto services.msc Il mio servizio si è mostrato in esecuzione, sebbene fosse già disinstallato. - Ho fatto clic su Arresta ricevuto un messaggio di errore, dicendo che il servizio non è in uno stato per ricevere messaggi di controllo. Tuttavia, il servizio è stato interrotto. - Chiuso services.msc. - Riaperto services.msc. - Il servizio non c'era più (non compare più nell'elenco dei servizi).

(L'ambiente era Windows 7.)


2
Su Windows 2008 qui, ho dovuto chiudere il pannello dei servizi
Mathijs Segers il

5

Nel mio caso, eseguo taskkill /f /im dongleserver.exe, dove si dongleserver.exetrova il file exe del mio programma.

Quindi posso già reinstallare il mio programma.


4

Nel mio caso, è stato causato da un'eccezione non gestita durante la creazione della sorgente eventLog. Utilizzare try catch per individuare la causa.


4

La chiusura di ogni finestra attualmente aperta seguita dall'esecuzione del comando seguente ha risolto il problema per me:

taskkill /F /IM mmc.exe

3

Chiudere la console dei servizi come suggerito da alcune delle risposte qui mi ha permesso di rimuovere il servizio. Nel mio scenario questa è stata solo una soluzione a breve termine poiché tutte le successive reinstallazioni e la rimozione del servizio mi avrebbero richiesto di prendere questi passaggi aggiuntivi. Esaminando il mio file web.config, è stato scoperto che si era verificato un errore che, una volta corretto, mi consentiva di rimuovere facilmente il servizio senza la chiusura aggiuntiva del passaggio della console dei servizi.


1

Questo funziona per me.

  • Apri Task Manager
  • Seleziona la scheda servizi
  • Seleziona il servizio con il problema
  • Fare clic destro e selezionare "Vai ai dettagli"
  • Fare clic con il tasto destro sul servizio e selezionare "Termina albero dei processi"

L'albero di fine processo termina il processo e tutti i processi creati dal processo.

Quindi, è possibile reinstallare il servizio.


1

Nel mio caso, il nome del servizio era "Monitor", utilizzato anche da un servizio Windows chiamato "Monitor", quando ho provato ad aggiornare i miei servizi, ho provato a disinstallarli, l'installatore ha cercato di rimuovere il servizio "Monitor" di Windows impossibile e l'installazione è stata sempre ripristinata.

Ho finito per rinominare il mio servizio con qualcos'altro


0

Se i passaggi forniti da @MainMa non hanno funzionato, seguire i passaggi seguenti

Passaggio 1 Provare a terminare il processo dal task manager di Windows o usando taskkill / F / PID. Puoi trovare il pid del processo con il comando 'sc queryex'. Prova il passaggio successivo se non riesci ancora a disinstallare.

Passaggio 2 Se sopra

Esegui Autoruns per Windows Cerca il servizio per nome ed elimina i risultati.


0

Il motivo principale dell'errore è che il processo non è stato arrestato. per risolverlo avvia il task manager vai ai servizi e vedi se sei ancora in grado di vedere il tuo servizio piuttosto che andare al processo di quel servizio e terminare il processo. Quindi il problema sarà risolto completamente.


0

Ho riscontrato questo problema quando utilizzavo Application Verifier per verificare il mio servizio di vincita. Anche dopo aver chiuso App Ver il mio servizio è stato bloccato dalla cancellazione. Solo la rimozione del servizio da App Ver ha risolto il problema e il servizio è stato eliminato immediatamente. Sembra che alcuni processi stiano ancora utilizzando il servizio dopo aver tentato di eliminarne uno.


0

passi da seguire:

passaggio-1 vai al percorso C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

comando di esecuzione step-2 : installutil / u full-path / servicename.exe

step-3 chiudi il pannello dei servizi e riaprilo

comando di esecuzione step-4 : installutil full-path / servicename.exe


1
una nota a margine: installutil funziona SOLO come admin, quindi apri una shell come admin.
Ingconti,

0

Molto probabilmente l'eliminazione del servizio non riesce perché

protected override void OnStop()

genera un errore quando si interrompe un servizio. l'avvolgimento di oggetti all'interno di un catch di prova eviterà di contrassegnare l'errore di eliminazione

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

}


0

A volte ciò può accadere durante l'eliminazione del servizio tramite lo script della sessione remota di PowerShell, specialmente quando si tenta di eliminare il servizio più volte. In questo caso, prova a ricreare una sessione prima dell'eliminazione:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
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.