Zaplanowane ponowne uruchomienie usługi z Powerhshell jako konto usługi innej niż administracyjna

11

Zanim zostanę zestrzelony, wiem, jak zaplanować zadanie, zrestartować usługę za pomocą programu PowerShell lub dać konto nieautoryzowane uprawnienia do ponownego uruchomienia usługi. To nie jest problem. Problemem jest jednak połączenie wszystkich tych trzech zadań razem.

Mam usługę systemu Windows, która musi przetwarzać pliki w folderze sieciowym. Dlatego loguje się przy użyciu „konta usługi”, które w rzeczywistości jest zwykłym kontem domeny. To konto domeny nie jest administratorem, ale ma prawa dostępu do tego folderu. Usługa działa dobrze i spełnia swoje zadanie.

Czasami występuje jednak błąd w jednym z plików, który uniemożliwia przetwarzanie innych plików. Zazwyczaj ktoś zauważa i zalega.

Stworzyłem więc skrypt monitorowania w PowerShell, który odpytuje folder sieciowy w poszukiwaniu tych błędnych plików. Jeśli zostaną znalezione, pliki zostaną przeniesione do folderu tymczasowego w celu przejrzenia i usługa musi zostać ponownie uruchomiona.

Dałem uprawnienia konta usługi poprzez zasady grupy, aby uruchomić i zatrzymać usługę.

wprowadź opis zdjęcia tutaj

Kiedy loguję się do serwera za pomocą konta usługi, jestem w stanie ręcznie zrestartować usługę za pomocą MMC usług. Jestem także w stanie wykonać skrypt PowerShell i robi dokładnie to, co powinien: sondować folder, przenosić pliki i ponownie uruchamiać usługę. Wspaniały!

W następnej fazie utworzyłem zaplanowane zadanie, które będzie uruchamiane co 10 minut. Zadanie używa tego samego konta usługi co usługa do wykonania skryptu PowerShell. Pole „wykonaj z najwyższymi uprawnieniami” jest zaznaczone. Tak jak powiedziałem, skrypt PowerShell potrzebuje dostępu do dysku sieciowego, więc nie mogę go uruchomić jako administrator serwera lokalnego i nie chcę używać poświadczeń administratora domeny do tak trudnego zadania jak ten. (Staram się wdrażać zasadę jak najmniejszego uprzywilejowania, jak tylko mogę).

Nadałem kontu usługi uprawnienia do „logowania jako zadania wsadowego” na lokalnym serwerze za pomocą MMC Local Security Policy.

Teraz część, której nie mogę zrozumieć: w zaplanowanym czasie zaplanowane zadania zostały pomyślnie zakończone i skrypt PowerShell jest wykonywany. Skrypt sprawdza folder i pliki błędów są przenoszone. Jedyne, co nie działa, to ponowne uruchomienie usługi ...?! Ponownie uruchomienie skryptu ręcznie, ponieważ ten sam użytkownik działał idealnie.

Nie widzę dużo w przeglądarce zdarzeń, ale logowanie do mojego skryptu stwierdza następujący błąd:

TerminatingError (Stop-Service): „Nie można otworzyć Menedżera sterowania usługami na komputerze '.”. Ta operacja może wymagać innych uprawnień. ”

Polecenia, których używam do ponownego uruchomienia usługi to:

Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])

(Korzystam z systemu Windows Server 2012 R2 i PowerShell w wersji 4 w domenie 2008 R2).

Aktualizacja: zarówno próbowałem ustawić uprawnienia usługi dla użytkownika korzystającego z subinacl (jak opisano tutaj ), jak i ręcznie ustawić ciąg SDDL (jak opisano tutaj ), więc moje flagi kontrolne wyglądają tak (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Próbowałem również ustawić uprawnienia w usłudze na Pełna kontrola w obiekcie zasad grupy. Żadne z nich nie rozwiązało również problemu. Musi mi problem z uprawnieniami gdzieś że ja wciąż wychodzi, bo kiedy zaplanować zadania przy użyciu konta domeny, które jest lokalnym admin na serwerze, to działa dobrze.

VolrathTheFallen
źródło
To może być pomocna serverfault.com/questions/357424/... wydaje się, że PowerShell jest bardzo wybredny co do uprawnień, a nie oczywistych
Drifter104,
@ Drifter104: Chociaż korzystam z GPO, aby ustawić uprawnienia do usługi, a nie subinacl, i tak spróbowałem z parametrami STOE, ale nadal widzę ten sam wynik. Podwójnie sprawdziłem ustawienia mojego obiektu zasad grupy i mają one również włączoną opcję Wyliczaj usługi zależne.
VolrathTheFallen
@ MyronSemack-msemack Próbowałem ręcznie ustawić ciąg SDDL dla usługi, jak opisano w tym artykule, ale nadal nie mam szczęścia, myślę, że ostatecznie GPO i subinacl robią to samo, ponieważ wydają się one zastępować jedno i drugie.
VolrathTheFallen,
1
A może spróbujesz Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....zamiast Stop-ServiceCmdLet? Zgodnie z następującą odpowiedzią Stop-Service i Start-Service najwyraźniej nie są zdalne. Nie można użyć Get-Service –nazwa_komputera na komputerze zdalnym, a komunikat o błędzie może być związany z próbą połączenia się z „zdalnym” hostem lokalnym ”. (<== to kropka.)
John aka hot2use,

Odpowiedzi:

3

Odpowiedź na inne pytanie również rozwiązała mój problem.

Kroki, które zrobiłem to:

  1. enable-psremoting na serwerze w monicie administracyjnym PowerShell
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI na serwerze w monicie administracyjnym PowerShell
  3. Dodano konto usługi (lub grupę zabezpieczeń) z pełnymi uprawnieniami
  4. sc sdshow scmanager na serwerze w wierszu polecenia administratora
  5. Skopiuj dane wyjściowe SDDL
  6. Dodaj (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)do SDDL przed częścią S:
  7. sc sdset scmanager THE_MODIFIED_SDDL mój wyglądał tak: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. Zmień mój skrypt PowerShell, aby używał Start-ServiceCmdLet zamiast Set-Service(Set-Service nie działał).

Wygląda na coś prostego, okazało się bardziej skomplikowane niż powinno być ...

VolrathTheFallen
źródło