Como resolver o erro "O serviço especificado foi marcado para exclusão"


584

Tento remover um serviço do Windows sc delete <service name>e encontro o seguinte erro:

[SC] DeleteService FAILED 1072:

O serviço especificado foi marcado para exclusão.

O que eu já fiz:

O problema persiste.

Qual é o próximo passo?


4
Uma reinicialização normalmente deve limpar qualquer estado remanescente.
— Damien_The_Unbeliever 13/13

14
Eu sei. Mas pensei em uma solução menos radical. Reiniciar trinta vezes por dia não será uma solução aceitável no meu caso.
— Arseni Mourzenko

54
"por que você está excluindo serviços isso regularmente?" : Estou escrevendo um serviço do Windows. Cada vez que é compilado, deve ser reiniciado. "No entanto, invadir o registro 30 vezes por dia é aceitável?" : totalmente. A remoção de uma chave do registro não me obriga a salvar tudo, fechar todos os aplicativos abertos, aguardar um minuto e reabrir tudo.
— Arseni Mourzenko

46
Eu escrevi serviços do Windows. A menos que você esteja alterando o código real que executa o registro, não há necessidade de desinstalar e reinstalá-lo toda vez que você faz uma compilação. Enquanto o caminho ainda for o mesmo, as informações de registro mais antigas ainda serão válidas.
— Damien_The_Unbeliever

4
@NickTurner - link para qualquer relatório de bug? Seja qual for o bug que você está se referindo, eu não encontrei. E eu não sei como um MSI está envolvido já que estamos falando presumivelmente sobre construir e executar serviços em uma máquina dev (que, pelo menos, parece ser o contexto sobre esta questão 5 anos de idade)
— Damien_The_Unbeliever

Respostas:


1244

Pode haver várias causas que levam ao serviço ser bloqueado em "marcado para exclusão".

  1. O Process Explorer da SysInternals é aberto . O fechamento deve levar à remoção automática do serviço.

  2. O Gerenciador de tarefas é aberto .

  3. O Console de Gerenciamento Microsoft (MMC) é aberto . Para garantir que todas as instâncias estejam fechadas, execute taskkill /F /IM mmc.exe.

  4. O console de serviços é aberto . É o mesmo que o ponto anterior, pois o console de Serviços é hospedado pelo MMC.

  5. O Visualizador de Eventos é aberto . Novamente, é o mesmo que o terceiro ponto.

  6. A chave HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {nome do serviço} existe .

  7. Outra pessoa está conectada ao servidor e tem um dos aplicativos mencionados anteriormente aberto.

  8. Uma instância do Visual Studio usada para depurar o serviço está aberta.


9
O gerenciador de tarefas parece fazer o mesmo. E, como observado abaixo, deixar o console de Serviços aberto também pode causar isso.
— CodingBarfield

4
... e se o fechamento de tudo isso ainda não ajudar e você ainda vê o serviço como "marcado para exclusão", faça logoff simples em vez de reiniciar completamente. isso me ajudou algumas vezes.
— Nedko

2
Um fluxo de trabalho comum: seus colegas nefastas também está conectado ao servidor remoto, e todos eles têm algo aberto ...
— Chris O

72
Fechar o console de serviços resolveu esse problema para mim! Meu processo foi o seguinte: No prompt de comando das Ferramentas Nativas do VS2012 x64 -> Navegue para o diretório com o serviço executável -> installutil / u servicename.exe (para desinstalar o serviço obsoleto) -> copiar sobre o novo serviço integrado exe - > installutil servicename.exe (para instalar o serviço atualizado) . Geralmente, posso desinstalar e reinstalar imediatamente, sem problemas. Até que eu não possa aleatoriamente. Fechar o console de serviços resolveu o problema. Obrigado pela dica!
— thehelix

17
O Process Explorer é o grande aqui, na minha opinião. Sugiro colocá-lo em negrito e / ou movê-lo para o topo da lista.
— Coxy

224

Isso também pode ser causado ao deixar o console de serviços aberto. O Windows não excluirá o serviço até que ele seja fechado.


3
Como indiquei na minha pergunta, "O Console de Gerenciamento Microsoft está fechado" durante os testes.
— Arseni Mourzenko

25
No meu caso, o console de serviços foi o problema. Assim que eu o fechei e reabri, os serviços excluídos foram embora.
— Farrukh Najmi

3
Difícil acreditar que manter a janela aberta era o caso ... Obrigado!
— quer

Isso funcionou para mim também, embora, estranhamente, tenha havido muitos casos em que simplesmente pressionar F5 atualize a lista com o serviço removido.
— 11118 Steve Smith

1
Você salvou o meu dia
— Pranoy Sarkar 08/11

50

Eu tive o mesmo problema, finalmente eu decidi matar o processo de serviço.

para isso, tente as etapas abaixo:

  • obter o ID do processo de serviço com

    sc queryex <service name>

  • matar processo com

    taskkill /F /PID <Service PID>


2
meu PID é 0, então é melhor não matar isso!
— 10266 Rob

você pode desinstalar o serviço para ele fazer os passos abaixo 1- prazo cmd 2 mudar de direcção para arquivo .exe do seu serviço de localizar que 3 executar o comando installutil / u <yourfilename.exe>
— Ali Sadri

+1 para sc queryex eu vou ser capaz de usar isso para obter a PID se eu quiser anexar o depurador
— Paul McCarthy

44

No meu caso, funcionou após o fechamento do Services. Verifique se o Services.mscestá aberto, se sim, feche-o e verifique se há algum processo de serviço em Task Manager.


13

Isso significa que o serviço ainda está listado como desativado em services.msc. Apenas feche o services.msc e abra como administrador ... O serviço não será listado. Agora, instale o serviço usando o comando

installutil "caminho do serviço"


11

A exclusão das chaves do registro, conforme sugerido acima, interrompeu o serviço no estado de parada. O procedimento a seguir funcionou para mim:

abra o gerenciador de tarefas> selecione a guia serviços> selecione o serviço> clique com o botão direito e selecione "ir para o processo"> clique com o botão direito do mouse no processo e selecione Finalizar processo

O serviço deve sair depois disso


7

Descobriu mais uma coisa a ser verificada - veja no Gerenciador de tarefas - se outros usuários estiverem conectados a essa caixa, mesmo se estiverem 'desconectados', você precisará realmente desconectá-los para que o serviço seja finalmente excluído.


4
Desnecessário. Você só precisa garantir que todos saiam do console de gerenciamento Microsoft (MMC) e do painel de controle de serviços.
— Marquês de Lorne

6

Parece que nas versões do Windows posteriores ao Windows 7 (não verificadas, mas pela experiência mais recente do Windows Server 2012 R2), o Service Control Manager (SCM) é mais rigoroso.

Enquanto no Windows 7 ele gera outro processo, agora está verificando se o processo do serviço ainda está por aí e pode retornar ERROR_SERVICE_MARKED_FOR_DELETE (1072) para qualquer chamada subsequente ao CreateService / DeleteService, mesmo que o serviço pareça estar parado.

Estou falando do código da API do Windows aqui, mas quero descrever claramente o que está acontecendo, portanto, essa sequência pode levar ao erro mencionado:

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

A razão pela qual um processo de serviço ainda existe após já ter relatado seu estado SERVICE_STOPPED não é surpreendente. É um processo regular, cuja thread principal está 'presa' em sua chamada para oStartServiceCtrlDispatcher API, para que ele reaja primeiro a uma ação de controle de parada, mas depois execute sua sequência de código restante.

É meio lamentável que o SCM / OS não esteja lidando com isso adequadamente para nós. Uma solução programática é meio simples e precisa: obtenha o identificador de processo do executável do serviço antes de interromper o serviço e aguarde até que esse identificador seja sinalizado.

Ao abordar o problema da perspectiva da administração do sistema, a solução é também aguardar o processo de serviço desaparecer completamente.


6

Foi o que funcionou para mim: - Caí no mesmo problema: meu serviço estava preso em 'marcado para exclusão'. - Abri services.msc Meu serviço apareceu como em execução, embora já tenha sido desinstalado. - Cliquei em Parar recebeu uma mensagem de erro, dizendo que o serviço não está em um estado para receber mensagens de controle. No entanto, o serviço foi interrompido. - Serviços fechados.msc. - Services.msc reaberto. - O serviço foi desativado (não aparece mais na lista de serviços).

(O ambiente era o Windows 7.)


2
Windows 2008 aqui, eu tinha que basta fechar o painel de serviços
— Mathijs Segers

5

No meu caso, eu executo taskkill /f /im dongleserver.exe, ondedongleserver.exe está o arquivo exe do meu programa.

Então já consigo reinstalar o meu programa.


4

No meu caso, foi causado por exceção não tratada ao criar a fonte eventLog. Use try catch para identificar a causa.


4

Fechar todas as janelas que estavam abertas no momento e executar o seguinte comando resolveu o problema para mim:

taskkill /F /IM mmc.exe

3

Fechar o console de serviços, conforme sugerido por algumas das respostas aqui, me permitiu remover o serviço. No meu cenário, isso foi apenas uma correção de curto prazo, pois todas as reinstalações e remoções subseqüentes do serviço exigiriam que eu tomasse essas etapas adicionais. Revendo meu arquivo web.config, foi descoberto que havia um erro que, uma vez corrigido, me permitia remover facilmente o serviço sem o fechamento adicional da etapa do console de serviços.


1

Isso funciona para mim.

  • Abra o Gerenciador de tarefas
  • Guia Selecionar serviços
  • Selecione o serviço com o problema
  • Clique com o botão direito e selecione "Ir para os detalhes"
  • Clique com o botão direito do mouse no serviço e selecione "Finalizar árvore do processo"

A árvore Finalizar processo encerrará o processo e todos os processos criados pelo processo.

Em seguida, você pode reinstalar o serviço.


1

No meu caso, o nome do serviço era 'Monitor', que também é usado por um serviço do Windows chamado 'Monitor', quando tentei atualizar meus serviços, tentei desinstalá-los, o instalador tentou remover o serviço 'Monitor' do Windows, que não podia, e a instalação era sempre revertida.

Acabei renomeando meu serviço para outra coisa


0

Se as etapas fornecidas pelo @MainMa não funcionarem, siga as etapas a seguir

Etapa 1 Tente matar o processo no gerenciador de tarefas do Windows ou use o taskkill / F / PID. Você pode encontrar o pid do processo pelo comando 'sc queryex'. Tente o próximo passo se você ainda não conseguir desinstalar.

Etapa 2 Se acima

Execute o Autoruns para Windows Procure o serviço por nome e exclua os resultados.


0

O principal motivo do erro é que o processo não está parado. para resolvê-lo, inicie o gerenciador de tarefas, vá para serviços e veja se você ainda pode ver seu serviço, depois vá para o processo desse serviço e finalize. Do que a questão será resolvida completamente.


0

Eu estava tendo esse problema quando estava usando o Application Verifier para verificar meu serviço vencedor. Mesmo depois que fechei o App Ver, meu serviço foi bloqueado para exclusão. Somente a remoção do serviço do App Ver resolveu o problema e o serviço foi excluído imediatamente. Parece que algum processo ainda está usando seu serviço depois que você tentou excluir um.


0

passos a seguir:

etapa 1 - vá para o local C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

comando de execução da etapa 2 : installutil / u caminho completo / servicename.exe

etapa 3 feche o painel de serviços e abra-o novamente

comando de execução da etapa 4 : installutil full-path / servicename.exe


1
uma observação lateral: installutil funciona SOMENTE como administrador, portanto, abra um shell como administrador.
— ingconti

0

Provavelmente, a exclusão do serviço falha porque

protected override void OnStop()

lançar erro ao parar um serviço. agrupar as coisas dentro de uma captura de tentativa evitará a marca de erro de exclusão

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

}


0

Às vezes, isso pode acontecer durante a exclusão do serviço via script de sessão remota do PowerShell, especialmente quando você está tentando excluir o serviço várias vezes. Nesse caso, tente recriar uma sessão antes da exclusão:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.