Geplanter Neustart eines Dienstes mit powerhshell als Nicht-Administrator-Dienstkonto

11

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.

Geben Sie hier die Bildbeschreibung ein

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.

VolrathTheFallen
quelle
Dies könnte hilfreich sein serverfault.com/questions/357424/… es scheint, dass Powershell sehr wählerisch in Bezug auf Berechtigungen ist und nicht die offensichtlichen
Drifter104
@ Drifter104: Obwohl ich GPO verwende, um die Berechtigungen für den Dienst festzulegen, nicht subinacl, habe ich es trotzdem mit den STOE-Parametern versucht, aber immer noch das gleiche Ergebnis gesehen. Überprüfen Sie meine GPO-Einstellungen doppelt und sie haben auch die Option Abhängige Dienste auflisten aktiviert.
VolrathTheFallen
@ MyronSemack-msemack Ich habe versucht, die SDDL-Zeichenfolge für den Dienst manuell festzulegen, wie im Artikel beschrieben, aber ich denke immer noch kein Glück, dass letztendlich ein Gruppenrichtlinienobjekt und ein Subinacl dasselbe tun, da sie einander zu überschreiben scheinen.
VolrathTheFallen
1
Wie wäre es mit einem Versuch Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....anstelle von Stop-ServiceCmdLet? 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.)
John aka hot2use

Antworten:

3

Die Beantwortung einer anderen Frage löste auch mein Problem.

Die Schritte, die ich tat, 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) mit den vollständigen Berechtigungen wurde hinzugefügt
  4. sc sdshow scmanager auf dem Server in einer Admin-Eingabeaufforderung
  5. Kopieren Sie die SDDL-Ausgabe
  6. Fügen Sie (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)der SDDL vor dem S: -Teil hinzu
  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 Start-Servicestattdessen CmdLet verwendet Set-Service(Set-Service hat nicht funktioniert).

Sieht aus wie etwas Einfaches, viel komplizierter, als es hätte sein sollen ...

VolrathTheFallen
quelle