Jak przyznać uprawnienia do zdalnego uruchamiania / zatrzymywania usługi za pomocą Powershell?

10

Mamy skrypt PowerShell, który ponownie uruchamia usługę na innym komputerze. Gdy używamy wbudowanych poleceń cmdlet kontroli usług PowerShell, to tak:

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

Otrzymujemy ten błąd z powrotem:

Stop-Service: Nie można otworzyć usługi MyService na komputerze „myservicehostname”.

Jednak gdy używamy sc.exe, to tak:

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

początek i koniec sukcesu.

Użytkownik wykonujący restartowanie nie jest administratorem. Korzystamy z subinacl, aby przyznać użytkownikowi uprawnienia do uruchamiania / zatrzymywania i wysyłania zapytań do usługi:

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

Dlaczego PowerShell nie może zatrzymać mojej usługi, ale sc.exemoże?

poplamione kawałki
źródło

Odpowiedzi:

20

Okazuje się, że nie dawałem wystarczających uprawnieńsubinacl . Możliwe wartości dostępu dla akcji przyznania to:

    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  

Korzystałem z S (Query Service Status), T (Start Service) i O (Stop Service). Potrzebowałem także E (Enumerate Dependent Services). Wygląda na to, że polecenia cmdlet programu PowerShell muszą sprawdzać usługi zależne podczas uruchamiania / zatrzymywania.

Oto moje zaktualizowane subinaclpolecenie:

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

Jeśli nie chcesz pobierać / używać subinacl.exe, możesz użyć programu PowerShell za pomocą funkcji Grant-ServiceControlPermission lub Grant-ServicePermission modułu Carbon . (OŚWIADCZENIE: Jestem właścicielem / opiekunem projektu Carbon.)

poplamione kawałki
źródło
Oznacz to jako poprawną odpowiedź. To była dla mnie ogromna pomoc dla dokładnie tego samego problemu :)
Alain O'Dea,
Nigdy wcześniej o tym nie słyszałem subinacl. Cóż za przydatne narzędzie! Dziękujemy za powrót i pozostawienie tych informacji reszcie z nas.
Dan
Działa świetnie w środowisku innym niż domena z serwerami Windows 2016 do kontrolowania usług na komputerach zdalnych.
Doug Knudsen
0

Następujące polecenie działa zgodnie z oczekiwaniami na moim komputerze z systemem Windows Server 2008 R2.

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

Czy możesz również wypróbować to jednorazowe polecenie, aby sprawdzić, czy to działa, i czy sprawdziłeś, czy użytkownik jest członkiem grupy, która jest członkiem grupy Użytkownicy na serwerach docelowych?

Greg Askew
źródło
Twój snipped nie działa dla mnie. Ze względu na wymagania bezpieczeństwa nie mogę uczynić użytkownika członkiem grupy Użytkownicy (lub jakiejkolwiek wbudowanej grupy Windows).
splattered bity