Como eu concedo permissões para iniciar / parar remotamente um serviço usando o Powershell?

9

Temos um script do PowerShell que reinicia um serviço em outro computador. Quando usamos os cmdlets de controle de serviço integrados do PowerShell, da seguinte forma:

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

Recebemos este erro de volta:

Stop-Service : Cannot open MyService service on computer 'myservicehostname'.

No entanto, quando usamos o sc.exe, assim:

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

o início e o término são bem-sucedidos.

O usuário que está reiniciando não é administrador. Usamos subinacl para conceder ao usuário permissões para iniciar / parar e consultar o serviço:

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

Como o PowerShell não pode parar meu serviço, mas sc.exe pode?

    
por splattered bits 06.02.2012 / 23:34

2 respostas

18

Acontece que eu não estava dando permissões suficientes com subinacl . Os possíveis valores de acesso para a ação de concessão são:

    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  

Eu estava usando S (status do serviço de consulta), T (serviço inicial) e O (serviço de parada). Também precisei de E (Enumerate Dependent Services). Parece que os cmdlets do PowerShell precisam examinar os serviços dependentes ao iniciar / parar.

Aqui está o meu comando subinacl atualizado:

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

Se você não quiser fazer o download / usar subinacl.exe , poderá usar o PowerShell por meio do módulo Carbono Grant-ServiceControlPermission ou Funções Grant-ServicePermission . (ISENÇÃO DE RESPONSABILIDADE: Eu sou o proprietário / mantenedor do projeto Carbon.)

    
por 07.02.2012 / 20:22
0

O seguinte comando funciona como esperado na minha máquina Windows Server 2008 R2.

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

Você também pode tentar esse único comando para determinar se isso funciona e verificou se o usuário é membro de um grupo que é membro do grupo Usuários nos servidores de destino?

    
por 06.02.2012 / 23:52