【问题标题】:Set-Service: Cannot stop service because it is dependent on other servicesSet-Service:无法停止服务,因为它依赖于其他服务
【发布时间】:2016-10-01 20:45:02
【问题描述】:

当我运行以下命令时:

Set-Service -ComputerName appserver -Name MyService -Status Stopped

我收到一条错误消息:

Set-Service : 无法停止服务“我的服务 (MyService)”,因为它是
依赖其他服务。
在行:1 字符:12
+ 设置服务 

我可以从services.msc GUI 停止服务,我可以使用Set-Service启动服务,但我不能再次停止它。

该服务确实依赖于其他一些服务,但我不明白为什么这会阻止我停止它 - else 不依赖于 它。

【问题讨论】:

  • 如果你先停止依赖服务?
  • sc stop MyService 工作吗?
  • @Kage: MyService 没有依赖服务。它依赖于AnotherService,但这无法停止,因为MyService 依赖于它。
  • @HarryJohnston sc \\appserver stop MyService 工作,是的。

标签: powershell windows-services windows-server-2008-r2


【解决方案1】:

Set-Service cmdlet 用于更改服务的配置。您可以使用它通过更改其状态来停止服务只是巧合。使用Stop-Service cmdlet 停止服务。它还允许您通过参数-Force 停止相关服务。不过,您需要先使用Get-Service 检索服务对象,因为Stop-Service 没有参数-ComputerName

Get-Service -Computer appserver -Name MyService | Stop-Service -Force

【讨论】:

  • The documentation 明确指出 Set-Service 可以停止和启动服务,所以我仍然认为这是一个错误。但很高兴知道有一个简单的解决方法。
  • 我没说不能。但只是服务本身。如果由于依赖服务而无法做到这一点,则它不允许像Stop-Service 那样将停止信号传递给它们。这是专门为停止服务而设计的。所以我不会认为这是Set-Service 中的错误。
  • 但是这种情况下没有依赖服务。 OP 试图停止的服务依赖于其他服务,而不是相反。
  • 我做了更多研究,发现this TechNet article 描述了这个确切的问题(不幸的是只有德语)。根据这篇文章,Set-Service 不处理依赖关系(在任一方向),所以-Status Stopped 只能用于没有依赖关系的服务。
  • 一种奇怪的表达方式!在我看来,枚举依赖于目标服务的服务(如果有的话,拒绝尝试停止服务)是有意义的。枚举目标服务所依赖的服务(如果有则拒绝停止服务)是一个错误,因为该信息与操作无关。 cmdlet 不需要“处理”这种情况,它只需要一开始就不必费心获取该信息!
【解决方案2】:

我最终用下面的代码解决了这个问题,它调用sc 来停止服务,然后等待它完成停止。这达到了与Set-Service -Status Stopped 预期的结果相同的结果;也就是说,当它返回时,服务已经停止。 (sc 自己开始 停止服务,但不会等到它完成停止。)

Start-Process "$env:WINDIR\system32\sc.exe" \\APPSERVER,stop,MyService -NoNewWindow -Wait
while ((Get-Service -ComputerName APPSERVER -Name MyService | 
Select -ExpandProperty Status) -ne 'Stopped') {
    Write-Host "Waiting for service to stop..."
    Start-Sleep -Seconds 10
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多