如何授予使用Powershell远程启动/停止服务的权限?

我们有一个PowerShell脚本来重新启动另一台计算机上的服务。 当我们使用PowerShell的内置服务控制cmdlet时,像这样:

$svc = Get-Service -Name MyService -ComputerName myservicehostname Stop-Service -InputObject $svc Start-Service -InputObject $svc 

我们得到这个错误:

停止服务:无法在计算机“myservicehostname”上打开MyService服务。

但是,当我们使用sc.exe时,就像这样:

 C:\Windows\System32\sc \\myservicehostname stop MyService C:\Windows\System32\sc \\myservicehostname start MyService 

开始和结束成功。

重新启动的用户不是pipe理员。 我们使用subinacl授予用户启动/停止和查询服务的权限:

 subinacl.exe /service MyService /GRANT=MyServiceControlUser=STO 

为什么PowerShell不能阻止我的服务,但sc.exe可以?

事实certificate, 我没有给予subinacl足够的权限 。 授予操作的可能访问值为:

  F : Full Control R : Generic Read W : Generic Write X : Generic eXecute or any following values L : Read controL Q : Query Service Configuration S : Query Service Status E : Enumerate Dependent Services C : Service Change Configuration T : Start Service O : Stop Service P : Pause/Continue Service I : Interrogate Service U : Service User-Defined Control Commands 

我正在使用S (查询服务状态), T (启动服务)和O (停止服务)。 我也需要E(Enumerate从属服务)。 看起来,PowerShell cmdlet在启动/停止时需要查看相关的服务。

这是我更新的subinacl命令:

 subinacl.exe /service MyService /GRANT=MyServiceControlUser=STOE 

如果您不想下载/使用subinacl.exe ,可以通过Carbon模块的Grant-ServiceControlPermission或Grant-ServicePermission函数使用PowerShell。 (免责声明:我是碳项目的所有者/维护者。)

以下命令在Windows Server 2008 R2计算机上按预期工作。

 Start-Service -InputObject $(Get-Service -Computer [ComputerName] -Name spooler) 

你也可以尝试这个一次性命令来确定是否有效,并且你是否证实用户是属于目标服务器上Users组成员的组的成员?