Answers:
过去让我着迷的一件事是,如果您正在运行服务查看器,那么这会阻止服务被完全删除,因此请事先关闭
您不必重新启动计算机。在提升模式下启动cmd或PowerShell。
sc.exe queryex <SERVICE_NAME>
然后,您将获得一些信息。将显示一个PID编号。
taskkill /pid <SERVICE_PID> /f
/ f强制停止。
现在,您可以安装或启动服务。
sc.exe queryex <SERVICENAME>
。因为sc
它也是的别名Set-Content
,所以当您使用它时将无声地失败。
好了,如果卸载没有被任何机会删除,则可以使用SC.EXE强制删除任何Windows Service。
sc delete <Service_Name>
阅读有关“ MS Techno博客”中的强行删除服务MMC的更多信息。
sc delete
如果该服务有打开的句柄,还将报告“该服务被标记为删除”。
sc delete sericeName
只需确保服务已停止,然后再执行此操作即可。我大部分时间都看过这项工作。有时我看到窗户卡在某些东西上,并且它坚持要重启。
关闭cmd和服务窗口(如果已打开),然后通过右键单击并选择以管理员身份运行再次启动cmd。如果sc delete sericeName
不起作用或任何东西不起作用。
万一此答案对某人有所帮助:如此处所示,您可能会避免以管理员身份运行Sysinternals Autoruns的麻烦。只需转到“服务”标签,然后删除您的服务即可。
它在我没有编辑注册表权限的机器上为我解决了问题。
您可以手动删除位于的服务的注册表项HKLM\SYSTEM\CurrentControlSet\Services
,此后,您将不会在服务控制管理器中看到该服务(需要刷新或重新打开才能看到更改),并且可以照常重新安装该服务。
我来晚了,但是想添加一个替代方法,它可能看起来很奇怪,但是我没有看到另一种方法:
每天晚上,我在CI流程中安装Windows服务时,我需要的东西始终可以工作并且完全自动化。由于某些原因,在卸载服务后,它们总是会被标记为删除很长时间(5分钟或更长时间)。因此,我扩展了重新安装批处理脚本,以确保确实删除了该服务(简化版):
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
我看到的是,该服务被标记为删除约5分钟(!),直到最终通过。最后,我不需要其他人工干预。我将在将来扩展脚本,以便在一定时间后会发生某些事情(例如30分钟后通知)。
这对我有用
$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()
如果你不能停在服务服务,你可以停在你的Windows服务的exe 任务管理器。之后,您可以删除该服务。
该主题中有很多论坛问题。
我在Windows API中找到了答案。卸载服务后,无需重新启动计算机。您必须致电:
BOOL WINAPI CloseServiceHandle(
SC_HANDLE hSCObject
);
这关闭了服务的句柄。在Windows 7上,它解决了我的问题。我做:
当TopShelf混乱或由于其他原因导致服务失败时,我将在某些地方使用以下PowerShell拼凑而成的Octopus Deploy实例。
$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