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

10

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

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

Recebemos esse erro de volta:

Serviço de parada: Não é possível abrir o serviço MyService no computador '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 a parada são bem-sucedidos.

O usuário que está reiniciando não é um 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 interromper meu serviço, mas sc.exepode?

bits esparramados
fonte

Respostas:

20

Acontece que eu não estava dando permissões suficientes comsubinacl . 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 (Iniciar Serviço) e O (Interromper Serviço). Eu também precisava do E (Enumerate Dependent Services). Parece que os cmdlets do PowerShell precisam examinar os serviços dependentes ao iniciar / parar.

Aqui está o meu subinaclcomando atualizado :

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

Se você não quiser baixar / usar subinacl.exe, poderá usar o PowerShell por meio das funções Grant-ServiceControlPermission ou Grant-ServicePermission do módulo Carbon . (AVISO LEGAL: Eu sou o proprietário / mantenedor do projeto Carbon.)

bits esparramados
fonte
Marque esta como sua resposta correta. Esta foi uma grande ajuda para mim para exatamente a mesma questão :)
Alain O'Dea
Eu nunca ouvi falar subinaclantes. Que utilidade útil! Obrigado por voltar e deixar essas informações para o resto de nós.
Dan
Funciona muito bem em ambientes que não são de domínio com servidores Windows 2016 para controlar serviços em computadores remotos.
Doug Knudsen
0

O comando a seguir funciona conforme o esperado na minha máquina Windows Server 2008 R2.

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

Você também pode tentar este comando único 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?

Greg Askew
fonte
Seu recorte não funciona para mim. Devido a requisitos de segurança, não posso tornar o usuário membro do grupo Usuários (ou de qualquer grupo interno do Windows).
bits splattered