指南

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 以对象的形式回来,所以它是加入管道,而不是取代管道。

是配合,而不是取代

回答这台计算机出了什么问题的工具,与更改某一项设置的工具,不是同一个工具。在这里提问,在这里阅读计划,然后用你喜欢的任何方式去执行它:计划会打印出请求同一件事的命令行,而这一行就是用来复制的。