Como forçar a desinstalação do serviço do Windows

173

Eu instalei um serviço do Windows usando o installUtil.exe.

Depois de atualizar o código, usei o installUtil.exe novamente para instalar o serviço sem desinstalar a versão original primeiro.

Quando agora tento desinstalar o serviço, o installUtil.exe conclui a desinstalação com êxito, mas o serviço ainda aparece.

Se eu tentar alterar suas propriedades, recebo a mensagem 'o serviço está marcado para exclusão'.

Como forçar a exclusão (de preferência sem reiniciar o servidor)?

Manu
fonte
Se o serviço estiver interrompido e a exclusão não funcionar, consulte Como forçar a desinstalação do serviço Windows
Wernfried Domscheit

Respostas:

469

Uma coisa que me chamou a atenção no passado é que, se você tem o visualizador de serviços em execução, isso impede que os serviços sejam totalmente excluídos, tão perto que antes

the_mandrill
fonte
70
Mal posso acreditar que ter o visualizador aberto interrompe a remoção do serviço - que estupidez!
Draemon
1
Isso é tão estúpido da Microsoft, mas funciona de fato. Por alguma razão inexplicável, ter o visualizador de serviços aberto impede que sejam excluídos adequadamente às vezes.
ivantod
1
Eu acho que essa resposta terá centenas de comentários semelhantes. Acabo de perder 30min com esta questão estúpida ...
PierrOz
2
Parece que o SysInternals process explorer também bloqueia os serviços (e talvez também o gerenciador de tarefas), portanto, feche-os também!
Danio
3
Também certifique-se de usar o prompt do cmd. O PowerShell não mostra nenhum erro, mas também não é excluído.
Bruno Faria
144

Você não precisa reiniciar sua máquina. Inicie o cmd ou o PowerShell no modo elevado.

sc.exe queryex <SERVICE_NAME>

Então você receberá algumas informações. Um número PID será exibido.

taskkill /pid <SERVICE_PID> /f

Onde / f é forçar a parada.

Agora você pode instalar ou iniciar seu serviço.

johan
fonte
2
Trabalhou de forma ousada, onde tudo o resto, exceto uma reinicialização, falhou - muito satisfeito!
DaveF
36
Isso não funcionou para mim - o pid do meu serviço retornou 0 e não me permitiu excluir um processo crítico do sistema.
plasma147
4
A + incrível. Use sc delete e acima.
precisa saber é
7
não trabalhou como PID veio como 0, este resolveu o meu problema - (SC) DeleteService FALHOU 1072
Web-E
3
Absolutamente útil! No meu caso, nada menos que uma reinicialização funcionou. Nem mesmo excluindo o diretório de serviço no Registro! Uma pegadinha embora: Se você estiver trabalhando em uso PowerShell: sc.exe queryex <SERVICENAME>. Como sctambém é um apelido para Set-Content, ele falhará silenciosamente quando você o usar.
Ifedi Okonkwo
97

bem, você pode usar o SC.EXE para excluir qualquer serviço do Windows com força se a desinstalação não remover por acaso.

sc delete <Service_Name>

Leia mais em "MS Techno Blogging" Excluindo serviços com força do MMC de serviços


fonte
5
Obrigado por isso. Observe que se o "Nome do serviço" não for o mesmo que o "Nome para exibição", você poderá obter o "Nome do serviço" nas propriedades do serviço.
GuiSim
8
sc deletetambém informará "o serviço está marcado para exclusão" se houver um identificador aberto para o serviço.
Matt
@GuiSim obrigado por isso, suspeito que muitos estarão colocando o nome de exibição como eu estava!
Nik0lai
Tentei isso, mas recebi esta mensagem: [SC] DeleteService FAILED 1072: O serviço especificado foi marcado para exclusão.
Andrew W. Phillips
37

Sei que isso não vai ajudar, mas pode ajudar alguém no futuro.

Acabei de ter o mesmo problema, fechar e reabrir o gerenciador de serviços removeu a entrada do registro e concluiu a desinstalação do serviço.

Antes disso, atualizar o gerente de serviços não ajudara.

Kennifer
fonte
1
Obrigado por compartilhar. Minha experiência foi exatamente como você descreveu.
pk.
10
sc delete sericeName

Apenas verifique se o serviço está parado antes de fazer isso. Eu já vi esse trabalho na maioria das vezes. Há momentos em que vi janelas travarem em algo e insiste em reiniciar.

Aaron Weiker
fonte
Apenas uma adição .. Eu tive que executar meu prompt do DOS / .NET como administrador para obter acesso para executar o comando sc delete .. apenas no caso de alguém encontrar esse problema.
Dav.id 14/05
Execute "NET STOP <serviceName>" antes do SC DELETE para garantir que o serviço foi parado antes da exclusão
Adi
Essa também foi minha experiência; eventualmente tive que reiniciar para remover um serviço teimoso que foi desinstalado apenas parcialmente (ele ainda apareceu no snap-in com um código 2). Reiniciar foi o que finalmente fez desaparecer.
delliottg
4

Infelizmente, você precisa reiniciar o servidor. Isso deve remover o serviço "excluído".

seanyboy
fonte
12
Não. Você não precisa reiniciar. Veja minha solução :)
johan
2
Na verdade, eu gosto ainda mais da solução do user186749. Legal e Limpo.
21412 McKay
3

Caso essa resposta ajude alguém: como encontrado aqui , você pode evitar muitos problemas ao executar o Autoris do Sysinternals como administrador. Basta ir para a guia "Serviços" e excluir seu serviço.

Ele fez o truque para mim em uma máquina onde eu não tinha permissão para editar o registro.

bronzeado
fonte
3

Você pode excluir manualmente a chave do registro do seu serviço, localizada em HKLM\SYSTEM\CurrentControlSet\Services, depois disso não verá o serviço no gerenciador de controle de serviços (precisa atualizar ou reabrir para ver a alteração) e pode reinstalar o serviço normalmente.

Fernando Gonzalez Sanchez
fonte
No Windows 2012 R2, o snap-in MMC de Serviços (Services.MSC) exibe " Falha ao Ler Descrição. Código de Erro: 2 ". Apesar de garantir que todos os outros MMCs foram fechados e nenhum outro usuário fez login.
Signal15
Entendo, apenas testado no Windows 8 e Windows 10 (e funcionou).
Fernando Gonzalez Sanchez
QUE finalmente resolveu meu problema. Esqueci de adicionar um instalador de serviço no projeto e não consegui remover meu serviço após a instalação. Eu recomendo fazer uma exportação da árvore de registro de serviço antes de excluir qualquer coisa nela. Muito obrigado!
User3772108
2

O seguinte funcionará sem reiniciar a máquina:

  1. Pesquise o <HKEY_LOCAL_MACHINE do Registro por <Nome do seu serviço> (chaves e valores)
  2. Defina o valor "Legado" como 0
Dmitry
fonte
1

Você tentou parar o serviço antes de chamar a desinstalação? Eu tive esse problema aleatoriamente. Em algum momento eu poderia removê-lo sem reiniciar. Meu palpite é que isso tem a ver com o serviço ainda em execução

defeituoso
fonte
1

Estou atrasado, mas gostaria de adicionar uma alternativa, que pode parecer estranha, mas não vi outra maneira:

Como instalo meus Serviços do Windows em um processo de IC todas as noites, eu precisava de algo que funcionasse o tempo todo e fosse completamente automatizado. Por alguma razão, os serviços sempre foram marcados para exclusão por um longo período de tempo (5 minutos ou mais) após a desinstalação. Portanto, estendi o script em lotes de reinstalação para garantir que o serviço seja realmente excluído (versão simplificada):

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

O que posso ver é que o serviço está marcado para exclusão por cerca de 5 minutos (!) Até finalmente ser concluído. Finalmente, não preciso de mais intervenções manuais. Estenderei o script no futuro para que algo aconteça após um certo tempo (por exemplo, notificação após 30 minutos).

marco
fonte
1

Isso funcionou para mim

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()
expirat001
fonte
Se sua saída é exibida ReturnValue : 16, o comando falhou com " Este serviço está sendo removido do sistema ". Lista completa dos ReturnValues ​​da Microsoft aqui
Signal15
1

Se você não conseguir parar o serviço nos Serviços , poderá parar o Windows Service Exe no Gerenciador de Tarefas . Depois disso, você pode remover o serviço.

Oguzhan KIRCALI
fonte
0

Atualizar a lista de serviços sempre fazia isso por mim. Se a janela de serviços estiver aberta, ela manterá alguma memória dela existente por algum motivo. F5 e estou reinstalando novamente!

Jer
fonte
0

Verifique também se não há instâncias do executável ainda ativas (talvez uma que possa estar em execução, por qualquer motivo, independentemente do serviço).

Eu estava abrindo e fechando o MMC e procurando os PIDs para matar - mas, ao procurar no Process Explorer, havia alguns processos existentes em execução em um lote programado esquecido. Matou eles. Tarefa concluída.

Sem fatias
fonte
0

Há muitas perguntas sobre o fórum nesse assunto.

Eu encontrei a resposta no Windows API. Você não precisa reiniciar o computador após desinstalar o serviço. Você precisa ligar para:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Isso fecha a alça do serviço. No Windows 7, resolveu o meu problema. Eu faço:

  • parar serviço
  • punho próximo
  • serviço de desinstalação
  • aguarde 3 seg
  • copiar novo exe para o diretório
  • instale o serviço
  • Começar serviço
  • punho próximo
Gabor Balazs
fonte
2
Onde você consegue fechar o identificador se não estiver no programa que possui o identificador aberto?
Matt
0

Eu uso o seguinte PowerShell em vários lugares para nossas instâncias do Octopus Deploy quando o TopShelf falha ou um serviço falha por algum outro 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
dragon788
fonte
0

Também é importante notar que isto:

sc delete "ServiceName"

não funciona no PowerShell, sc é um alias para o cmdlet Set-Content no PowerShell. Você precisa fazer:

sc.exe delete "ServiceName"
Richard
fonte