我试图找出为什么服务处于 STOP_PENDING 状态,但该服务似乎被隐藏了。
它不会出现在常规中sc query
,也services.msc
不会出现在 Powershell 中Get-Service
。
事情是这样的:
我曾经findstr
在一组文件中搜索一个字符串,结果在一个包含大量 ASCII BELL 字符的二进制文件中找到了它。所以我的控制台发出了一连串无休止的哔哔声。于是我打开了另一个控制台来停止哔哔声:
net stop beep
没问题,哔哔声停止了。但是当我发出 时net start beep
,我总是收到错误:
服务正在启动或停止。请稍后重试。
如果我这样做,我可以看到服务的状态:
sc query beep
但将军sc query
却不表现出服务精神。
问题:
为什么没有beep
列出该服务?为什么它没有出现在sc query
或services.msc
中Get-Services
?是否存在隐藏服务?
另外,我如何让此服务重新启动?此服务始终以这种方式做出反应。如果我停止它,它会卡在STOP_PENDING
状态并一直保持这种状态,直到我重新启动。
答案1
sc
可以控制常规服务和驱动程序(在低级术语中,它们都是“服务”,但驱动程序的服务类型为KERNEL_DRIVER
)。beep
是驱动程序。默认情况下,sc
仅列出非驱动程序服务。(此外,默认情况下,它仅列出处于“活动”状态的条目。)
从输出中可以明显看出这一点sc /?
:
USAGE:
sc <server> [command] [service name] <option1> <option2>...
[...]
QUERY and QUERYEX OPTIONS :
If the query command is followed by a service name, the status
for that service is returned. Further options do not apply in
this case. If the query command is followed by nothing or one of
the options listed below, the services are enumerated.
type= Type of services to enumerate (driver, service, all)
(default = service)
state= State of services to enumerate (inactive, all)
(default = active)
[...]
SYNTAX EXAMPLES
sc query - Enumerates status for active services & drivers
sc query messenger - Displays status for the messenger service
sc queryex messenger - Displays extended status for the messenger service
sc query type= driver - Enumerates only active drivers
sc query type= service - Enumerates only Win32 services
sc query state= all - Enumerates all services & drivers
[...]
正如你在这里看到的,它表示该type=
参数允许选择service
,driver
或all
,默认为service
. 1(类似地,该state=
参数的默认值为active
。)
因此,列出全部活动的服务/驱动程序,您可以使用sc query type= all
。要列出不活动的服务/驱动程序,您可以使用sc query type= all state= all
。
至于如何重新启动蜂鸣驱动程序:据我所知,没有办法。它beep
并不是真正设计用来停止的。但它半工作(而且它是设置为STOPPABLE
),这样它至少可以停止蜂鸣声,并且在停止时不会使系统崩溃(不幸的是,其他一些驱动程序会这样做),但它既不能正确清理其状态,又会一直卡在状态,STOP_PENDING
因为它从不告诉服务管理器它现在是STOPPED
。 唯一(我知道的)恢复蜂鸣声的方法是重新启动计算机。
顺便说一句,如果你正在寻找一个更强大的服务管理 GUI(包括司机型服务),看看进程黑客。它有一个“服务”选项卡,它不仅允许您列出和控制所有服务,还可以以services.msc
您无法做到的方式编辑它们(例如更改它们的路径)。但请记住,能力越大,责任越大。你也可能用它毁掉你的系统。
脚注:
1. 在这里我们必须明白,sc
尝试使用“用户对话”并调用KERNEL_DRIVER
“驱动程序”类型的服务而不是“服务”,即使它们(从低级角度来看)在技术上都是服务。这类似于使用创建和打开文件的方式,CreateFile
因为它创建一份文件处理然而,世界上的每个 UI 都不会将打开现有文件视为“创建”任何东西。不幸的是,这种观点的区别常常使术语非常混乱,因为同一个术语可能意味着完全不同的东西,或者像这里一样部分地部分是相同的,但部分不是,这完全取决于您从内核、用户模式 API 还是 Windows Shell(仅举几例)的角度来看待它。