Bevor ich abgeschossen werde, kann ich eine Aufgabe planen, einen Dienst mit Powershell neu starten oder einem Nicht-Administratorkonto die Berechtigung zum Neustart eines Dienstes erteilen. Das ist nicht das Problem. Das Problem ist jedoch die Kombination all dieser drei Aufgaben zusammen.
Ich habe einen Windows-Dienst, der Dateien in einem Netzwerkordner verarbeiten muss. Daher meldet es sich mit einem "Dienstkonto" an, das eigentlich nur ein reguläres Domänenkonto ist. Dieses Domänenkonto ist kein Administrator, verfügt jedoch über Zugriffsrechte für diesen Ordner. Der Service läuft gut und macht seinen Job.
Manchmal liegt jedoch ein Fehler in einer der Dateien vor, der die Verarbeitung anderer Dateien verhindert. Normalerweise dauert es eine Weile, bis jemand es bemerkt und es gibt einen Rückstand.
Also habe ich ein Überwachungsskript in Powershell erstellt, das den Netzwerkordner nach diesen fehlerhaften Dateien abfragt. Wenn sie gefunden werden, werden die Dateien zur Überprüfung in einen temporären Ordner verschoben und der Dienst muss neu gestartet werden.
Ich habe dem Dienstkonto Berechtigungen über Gruppenrichtlinien erteilt, um den Dienst zu starten und zu stoppen.
Wenn ich mich mit dem Dienstkonto beim Server anmelde, kann ich den Dienst manuell über die Dienst-MMC neu starten. Ich kann auch das Powershell-Skript ausführen und es macht genau das, was es tun soll: den Ordner abfragen, die Dateien verschieben und den Dienst neu starten. Groß!
In der nächsten Phase habe ich eine geplante Aufgabe erstellt, die alle 10 Minuten ausgeführt wird. Die Aufgabe verwendet dasselbe Dienstkonto wie der Dienst, um das Powershell-Skript auszuführen. Das Kontrollkästchen "Mit den höchsten Berechtigungen ausführen" ist aktiviert. Wie gesagt, das Powershell-Skript benötigt Zugriff auf das Netzwerklaufwerk, daher kann ich es nicht als Administrator des lokalen Servers ausführen und möchte für eine solche einfache Aufgabe keine Anmeldeinformationen für den Domänenadministrator verwenden. (Ich versuche, das Prinzip der geringsten Privilegien so weit wie möglich umzusetzen.)
Ich habe dem Dienstkonto die Rechte "Anmeldung als Stapeljob" auf dem lokalen Server mithilfe der MMC für lokale Sicherheitsrichtlinien erteilt.
Nun zu dem Teil, den ich nicht herausfinden kann: Zum geplanten Zeitpunkt werden die geplanten Aufgaben erfolgreich abgeschlossen und das Powershell-Skript wird ausgeführt. Das Skript fragt den Ordner ab und die Fehlerdateien werden verschoben. Das einzige, was nicht funktioniert, ist den Dienst neu zu starten ...?! Auch hier funktionierte das manuelle Ausführen des Skripts als derselbe Benutzer einwandfrei.
Ich sehe nicht viel in der Ereignisanzeige, aber die Protokollierung in meinem Skript gibt diesen Fehler an:
TerminatingError (Stop-Service): "Service Control Manager kann nicht auf Computer '' geöffnet werden. 'Für diesen Vorgang sind möglicherweise andere Berechtigungen erforderlich."
Die Befehle, mit denen ich den Dienst neu starte, sind:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(Ich verwende Windows Server 2012 R2 und Powershell Version 4 auf einer 2008 R2-Domäne.)
Update: Ich habe beide versucht, die Dienstberechtigungen für den Benutzer mithilfe von subinacl (wie hier beschrieben ) und die SDDL-Zeichenfolge manuell (wie hier beschrieben ) festzulegen , sodass meine Steuerflags folgendermaßen aussehen (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Ich habe auch versucht, die Berechtigungen für den Dienst im Gruppenrichtlinienobjekt auf Vollzugriff zu setzen. Keines davon löste das Problem. Es muss ich ein Problem mit den Rechten irgendwo , dass ich immer noch mit Blick auf , denn wenn ich die Aufgabe mit einem Domänenkonto planen , die ein lokaler Administrator auf dem Server ist, es funktioniert gut.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
anstelle von Stop-Service
CmdLet? Stop-Service und Start-Service sind laut dieser Antwort anscheinend nicht remote-fähig: Get-Service –ComputerName kann nicht auf einem Remote-Computer verwendet werden, und Ihre Fehlermeldung hängt möglicherweise mit dem Versuch zusammen, eine Verbindung zu einem "Remote" -Hosthost herzustellen . ' (<== das ist ein Punkt dort.)