Wie erteile ich Berechtigungen zum Remote-Starten / Stoppen eines Dienstes mit Powershell?

10

Wir haben ein PowerShell-Skript, das einen Dienst auf einem anderen Computer neu startet. Wenn wir die in PowerShell integrierten Cmdlets für die Dienststeuerung verwenden, gehen Sie wie folgt vor:

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

Wir bekommen diesen Fehler zurück:

Stop-Service: Der MyService-Dienst kann auf dem Computer 'myservicehostname' nicht geöffnet werden.

Wenn wir jedoch sc.exe verwenden, wie folgt:

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

Start und Stopp sind erfolgreich.

Der Benutzer, der den Neustart durchführt, ist kein Administrator. Wir verwenden subinacl, um dem Benutzer die Berechtigung zum Starten / Stoppen und Abfragen des Dienstes zu erteilen:

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

Wie kommt es, dass PowerShell meinen Dienst nicht stoppen sc.exekann, aber kann?

bespritzte Bits
quelle

Antworten:

20

Es stellte sich heraus, dass ich nicht genug Berechtigungen erteilt habesubinacl . Die möglichen Zugriffswerte für die Grant-Aktion sind:

    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  

Ich habe S (Abfragedienststatus), T (Dienst starten) und O (Dienst beenden) verwendet. Ich brauchte auch E (Enumerate Dependent Services). Es scheint, dass die PowerShell-Cmdlets beim Starten / Stoppen abhängige Dienste berücksichtigen müssen.

Hier ist mein aktualisierter subinaclBefehl:

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

Wenn Sie nicht herunterladen / verwenden möchten, können subinacl.exeSie PowerShell über die Funktionen Grant-ServiceControlPermission oder Grant-ServicePermission des Carbon- Moduls verwenden . (HAFTUNGSAUSSCHLUSS: Ich bin der Eigentümer / Betreuer des Carbon-Projekts.)

bespritzte Bits
quelle
Bitte markieren Sie dies als Ihre richtige Antwort. Dies war eine große Hilfe für mich für genau das gleiche Problem :)
Alain O'Dea
Ich habe noch nie davon gehört subinacl. Was für ein nützliches Dienstprogramm! Vielen Dank, dass Sie zurückgekommen sind, um diese Informationen für den Rest von uns zu hinterlassen.
Dan
Funktioniert hervorragend in Umgebungen ohne Domänen mit Windows 2016-Servern, um Dienste auf Remotecomputern zu steuern.
Doug Knudsen
0

Der folgende Befehl funktioniert wie erwartet auf meinem Windows Server 2008 R2-Computer.

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

Können Sie diesen einmaligen Befehl auch versuchen, um festzustellen, ob dies funktioniert, und haben Sie überprüft, ob der Benutzer Mitglied einer Gruppe ist, die Mitglied der Benutzergruppe auf den Zielservern ist?

Greg Askew
quelle
Dein Snipped funktioniert bei mir nicht. Aus Sicherheitsgründen kann ich den Benutzer nicht zu einem Mitglied der Benutzergruppe (oder einer integrierten Windows-Gruppe) machen.
bespritzte Bits