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?

Arseni Mourzenko
fonte
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.

Arseni Mourzenko
fonte
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.

forçado
fonte
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>

Ali Sadri
fonte
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.

Sumit Agrawal
fonte
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"

Amey P Naik
fonte
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

mathart63
fonte
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.

Kathy Gryta
fonte
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.

klaus triendl
fonte
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.)

balintn
fonte
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.

Sian Chiew See
fonte
4

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

Arijus Gilbrantas
fonte
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
Tshilidzi Mudau
fonte
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.

GatesReign
fonte
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.

OIbuoye
fonte
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

Yaman
fonte
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.

Charith
fonte
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.

Gaurav Tyagi
fonte
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.

vadzvnik
fonte
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

Divyang Shah
fonte
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)
            {
            }

}

e03050
fonte
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
Alex Podles
fonte