Comment accorder des autorisations pour démarrer / arrêter à distance un service à l'aide de Powershell?

10

Nous avons un script PowerShell qui redémarre un service sur un autre ordinateur. Lorsque nous utilisons les applets de commande de contrôle de service intégrées de PowerShell, comme ceci:

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

Nous récupérons cette erreur:

Stop-Service: impossible d'ouvrir le service MyService sur l'ordinateur 'myservicehostname'.

Cependant, lorsque nous utilisons sc.exe, comme ceci:

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

le démarrage et l'arrêt réussissent.

L'utilisateur effectuant le redémarrage n'est pas un administrateur. Nous utilisons subinacl pour accorder aux utilisateurs des autorisations pour démarrer / arrêter et interroger le service:

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

Comment se fait-il que PowerShell ne puisse pas arrêter mon service mais le sc.exepeut?

bits éclaboussés
la source

Réponses:

20

Il s'avère que je ne donnais pas assez d'autorisations avecsubinacl . Les valeurs d'accès possibles pour l'action de subvention sont les suivantes:

    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  

J'utilisais S (Query Service Status), T (Start Service) et O (Stop Service). J'avais également besoin de E (Enumerate Dependent Services). Il semble que les applets de commande PowerShell doivent examiner les services dépendants lors du démarrage / de l'arrêt.

Voici ma subinaclcommande mise à jour :

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

Si vous ne souhaitez pas télécharger / utiliser subinacl.exe, vous pouvez utiliser PowerShell via les fonctions Grant-ServiceControlPermission ou Grant-ServicePermission du module Carbon . (AVERTISSEMENT: je suis le propriétaire / mainteneur du projet Carbon.)

bits éclaboussés
la source
Veuillez indiquer ceci comme votre réponse correcte. Cela m'a été d'une grande aide pour le même problème :)
Alain O'Dea
Je n'en ai jamais entendu parler subinaclauparavant. Quel utilitaire utile! Merci d'être revenu pour laisser ces informations au reste d'entre nous.
Dan
Fonctionne très bien dans un environnement hors domaine avec des serveurs Windows 2016 pour contrôler les services sur des ordinateurs distants.
Doug Knudsen
0

La commande suivante fonctionne comme prévu sur mon ordinateur Windows Server 2008 R2.

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

Pouvez-vous également essayer cette commande unique pour déterminer si cela fonctionne, et avez-vous vérifié que l'utilisateur est membre d'un groupe qui est membre du groupe d'utilisateurs sur les serveurs cibles?

Greg Askew
la source
Votre coupure ne fonctionne pas pour moi. En raison d'exigences de sécurité, je ne peux pas faire de l'utilisateur un membre du groupe d'utilisateurs (ou de tout groupe Windows intégré).
éclaboussures