Frage Geplanter Neustart eines Dienstes mit PowerShell als Nicht-Administrator-Dienstkonto


Bevor ich abgeschossen werde, weiß ich, wie man eine Aufgabe plant, einen Dienst mit Powershell neu startet oder einem Nicht-Admin-Konto die Rechte gibt, einen Dienst neu zu starten. Das ist nicht das Problem. Das Problem ist jedoch die Kombination all dieser drei Aufgaben kombiniert.

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, hat jedoch Zugriffsrechte für diesen Ordner. Der Service läuft gut und macht seinen Job.

Manchmal gibt es jedoch einen Fehler in einer der Dateien, der verhindert, dass andere Dateien verarbeitet werden. 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 den Dienstkontoberechtigungen über Gruppenrichtlinien erteilt, um den Dienst zu starten und zu stoppen.

enter image description here

Wenn ich mich mit dem Dienstkonto beim Server anmelde, kann ich den Dienst manuell mithilfe der Dienst-MMC neu starten. Ich bin auch in der Lage, das Powershell-Skript auszuführen, und es macht genau das, was es tun soll: den Ordner abfragen, die Dateien verschieben und den Dienst neu starten. Großartig!

In der nächsten Phase habe ich eine geplante Aufgabe erstellt, die alle 10 Minuten ausgeführt wird. Die Aufgabe verwendet das gleiche Dienstkonto wie der Dienst, um das Powershell-Skript auszuführen. Die Checkbox "Mit den höchsten Rechten ausführen" ist aktiviert. Wie gesagt, das Powershell-Skript benötigt Zugriff auf das Netzlaufwerk, daher kann ich es nicht als lokaler Serveradministrator ausführen und ich möchte keine Domänenadministrator-Anmeldeinformationen für solch eine einfache Aufgabe wie diese verwenden. (Ich versuche, das Prinzip des geringsten Privilegs so weit wie möglich umzusetzen.)

Ich gab dem Dienstkonto die Rechte "Anmelden als Stapeljob" auf dem lokalen Server mithilfe der lokalen Sicherheitsrichtlinie MMC.

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 das Neustarten des Dienstes ...?! Erneutes Ausführen des Skripts von Hand, da derselbe Benutzer einwandfrei funktioniert.

Ich sehe in der Ereignisanzeige nicht viel, aber die Protokollierung meines Skripts gibt diesen Fehler an:

TerminatingError (Stop-Service): "Dienststeuerungs-Manager kann nicht auf dem Computer geöffnet werden.". Dieser Vorgang erfordert möglicherweise andere Berechtigungen. "

Die Befehle, die ich zum Neustarten des Dienstes verwende, sind:

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

(Ich verwende Windows Server 2012 R2 und Powershell Version 4 für eine 2008 R2 Domain.)

Aktualisieren: Ich habe versucht, die Service-Berechtigungen für den Benutzer mit subinacl (wie beschrieben) Hier) und setzen Sie die SDDL - Zeichenfolge manuell (wie beschrieben) Hier), so sehen meine Kontrollflags so aus (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1-X-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Ich habe auch versucht, die Berechtigungen für den Dienst auf Vollzugriff im Gruppenrichtlinienobjekt festzulegen. Keines dieser Probleme löste das Problem. Es muss mir ein Problem mit Privilegien sein irgendwo dass ich immer noch überblicke, denn wenn ich die Aufgabe mit einem Domänenkonto plane, das ein lokaler Administrator auf dem Server ist, funktioniert es gut.


11
2017-12-29 13:10


Ursprung


Dies könnte hilfreich sein serverfault.com/questions/357424/ ... Es scheint, Powershell ist sehr wählerisch über Berechtigungen und nicht die offensichtlichen - Drifter104
stackoverflow.com/questions/4436558/ ... - myron-semack
@ Drifter104: Obwohl ich GPO verwende, um die Berechtigungen für den Dienst zu setzen, nicht subinacl, habe ich es trotzdem mit den STOE-Parametern versucht, aber immer noch das gleiche Ergebnis. Meine Gruppenrichtlinieneinstellungen wurden überprüft. Außerdem ist die Option "Abhängige Dienste aufzählen" aktiviert. - VolrathTheFallen
@ MyronSemack-msemack Ich habe versucht, die SDDL-Zeichenfolge für den Service manuell wie im Artikel beschrieben, aber immer noch kein Glück, denke ich, dass letztlich ein GPO und subinacl das gleiche tun, da sie das eine und andere zu überschreiben scheinen. - VolrathTheFallen
Wie wäre es mit einem Versuch? Set-Service $($service[1]) -status stopped -ComputerName . -Verbose .... anstatt der Stop-Service CmdLet? Stop-Service und Start-Service sind laut dieser Antwort offenbar nicht remote erreichbar: Get-Service -ComputerName kann nicht auf Remotecomputer verwendet werden und Ihre Fehlermeldung könnte damit zusammenhängen, dass Sie versuchen, sich mit einem "remote" localhost zu verbinden. ' (<== das ist ein Punkt dort.) - hot2use


Antworten:


Das Antwort auf eine andere Frage löste mein Problem auch.

Die Schritte, die ich gemacht habe, waren:

  1. enable-psremoting auf dem Server in einer Admin-Powershell-Eingabeaufforderung
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI auf dem Server in einer Admin-Powershell-Eingabeaufforderung
  3. Das Dienstkonto (oder die Sicherheitsgruppe) wurde mit vollen Rechten hinzugefügt
  4. sc sdshow scmanager auf dem Server in einer Admin-Eingabeaufforderung
  5. Kopieren Sie die SDDL-Ausgabe
  6. Hinzufügen (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP) an die SDDL vor dem S: Teil
  7. sc sdset scmanager THE_MODIFIED_SDDL meins sah so aus: 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. Ändern Sie mein Powershell-Skript so, dass es den Start-Service CmdLet statt Set-Service (Set-Service hat nicht funktioniert).

Sieht so aus als wäre etwas Einfaches weggefallen, viel komplizierter als es hätte sein sollen ...


4
2017-12-30 12:08