指南
sc.exe 和 Get-Service,以及这个工具
两者都已经在计算机上,而且都会继续有用。这个页面讲的是它们在哪里到头了,并且坦率地说明它们在哪些地方仍然是更好的答案。
各自在哪里到头
sc.exe
它几乎可以触及服务控制管理器所知的一切,却完全不告诉你该如何提问。语法来自九十年代:sc config X start= auto,等号后面的空格是必需的,缺少它会悄无声息地做不成你想做的事。
它一次只回答一个条目。没有筛选,没有无需自己写解析器就能让脚本解析的输出,也没有预览:sc stop 要么成功,要么返回一个数字。
Get-Service 和 *-Service cmdlet
真正的对象、管道,以及浅层的视角。在 Windows 自带的 Windows PowerShell 5.1 中,Get-Service 不显示服务运行所用的账户,也不显示它的描述。PowerShell 7 两者都显示,还显示启动路径,并且需要单独安装。
Stop-Service -Force 的意思是“即使有东西依赖它”:它会停止依赖项,并且是在事后而不是事前告诉你。
同样的问题,三种方式
| 问题 | 用计算机上现有的工具 | 在这里 |
|---|---|---|
| 应该运行却没有运行的内容 | Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } |
bws list --query "start:auto !status:running" |
| 哪些服务的可执行文件没有签名 | 读取每个启动路径,解析它,对每个调用 Get-AuthenticodeSignature:这是一个脚本,而不是一条命令 |
bws list --query "signed:no" |
| 停止它会带走什么 | sc enumdepend X,然后阅读列表并自己判断 |
bws stop X --dry-run --dependents,也就是将要运行的计划 |
| 自上周以来发生了什么变化 | 没有,除非你自己写了收集器 | bws snapshot diff before.json --live |
| 谁在何时更改了启动类型 | Get-WinEvent -FilterHashtable @{ LogName = 'System'; Id = 7040 },然后阅读每个事件的消息 |
bws history Spooler,其第一行说明日志能追溯多远 |
| 机器可读的输出 | PowerShell 给出对象,sc.exe 给出文本 |
每个命令都支持 --json,输出到标准输出,警告输出到标准错误 |
这个工具在某个服务上与 sc.exe 不一致时,那在这里就是一个缺陷。测试套件的一部分会针对所在的计算机同时运行两者,并逐条目地比较,而两者之间的差异,是你能放进问题报告里最有用的东西。
何时继续使用你已有的工具
- 你在一台只会碰一次的计算机上。两者都已经在那里了,也不必通过任何策略。
- 你需要更改账户、启动路径或恢复操作。
sc.exe三者都能做。这个工具会显示账户和启动路径,但不会更改其中任何一个,而读取恢复操作只是为了在结束进程之前发出警告。 - 你需要创建或删除服务。
sc create和sc delete。这里没有,这是有意为之。 - 你已经深入 PowerShell 管道。
bws list --json通过ConvertFrom-Json以对象的形式回来,所以它是加入管道,而不是取代管道。
是配合,而不是取代
回答这台计算机出了什么问题的工具,与更改某一项设置的工具,不是同一个工具。在这里提问,在这里阅读计划,然后用你喜欢的任何方式去执行它:计划会打印出请求同一件事的命令行,而这一行就是用来复制的。