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ę.
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.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
zamiast Stop-Service
CmdLet? 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.)