Ich muss jedes Mal, wenn ein System heruntergefahren wird, ein Batch-Skript ausführen, unabhängig davon, ob der Computer mit dem Netzwerk verbunden ist oder nicht. (Es sollte für die Frage keine Rolle spielen, aber das betreffende Skript löscht die Druckwarteschlange des Geräts.
Ich kann dieses Skript jedoch nicht ausführen, wenn der PC vom Netzwerk offline ist, wenn ich die folgende Methode verwende.
Ich könnte auch hinzufügen, dass auf dem fraglichen PC Windows 10 Pro x64 (Version 1809) ausgeführt wird. Auf dem Domänencontroller wird Windows Server 2008 R2 ausgeführt, und hier habe ich auch ausgeführt gpedit.msc
.
Was ich bisher gemacht habe:
- Erstellt ein Active Directory- Gruppenrichtlinienobjekt mit einem Skript zum Herunterfahren des Computers.
- Das Skript wurde dem GPO-Ordner in SYSVOL hinzugefügt .
- Bestätigt, dass dieses Gruppenrichtlinienobjekt tatsächlich auf die Festplatte der betreffenden Workstation heruntergeladen wurde und daher offline zugänglich sein sollte.
- Die im Gruppenrichtlinienobjekt angegebenen Pfade sind relativ und nicht absolut.
Was ich passieren möchte:
- Wenn der PC heruntergefahren wird, wird das
ClearPrintQueue.bat
Skript ausgeführt, unabhängig davon, ob der PC derzeit über eine Netzwerkverbindung verfügt oder nicht.
Was passiert eigentlich:
- Wenn der PC heruntergefahren wird, wird das
ClearPrintQueue.bat
Skript nur ausgeführt, wenn der PC derzeit die SYSVOL- Freigabe über das Netzwerk erreichen kann.
Einzelheiten:
Ich habe ein Gruppenrichtlinienobjekt in der Domäne erstellt und es mit einer Test-Organisationseinheit verknüpft, die den betreffenden Computer enthält.
Ich habe das Gruppenrichtlinienobjekt bearbeitet und zu Computerkonfiguration -> Richtlinien -> Windows-Einstellungen -> Skripts (Starten / Herunterfahren) -> Herunterfahren navigiert
Die Eigenschaften zum Herunterfahren wie folgt :
Wenn Sie auf Dateien anzeigen ... klicken, wird der Explorer geöffnet, um den Ordner anzuzeigen\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown
Der Inhalt dieses Ordners und der Datei ClearPrintQueue.bat lauten wie folgt:
PS C:\> Get-ChildItem "\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown"
Directory: \\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2019-04-23 15:00 71 ClearPrintQueue.bat
PS C:\> Get-Content "\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat"
net stop spooler
del %systemroot%\System32\spool\printers\* /Q /F /S
PS C:\>
Bei der Untersuchung eines lokalen PCs kann ich feststellen, dass das Skript tatsächlich in den lokalen Gruppenrichtlinienobjektspeicher des PCs kopiert wurde:
PS C:\> Get-ChildItem -Recurse -Force -File "C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}"
Directory: C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2019-04-23 15:00 59 gpt.ini
Directory: C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a-h-- 2019-04-23 15:00 118 scripts.ini
Directory: C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2019-04-23 15:00 71 ClearPrintQueue.bat
PS C:\>
Nachforschungen in scripts.ini
und ClearPrintQueue.bat
auf der lokalen Festplatte des PCs finden wir:
PS C:\> Get-Content "C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\scripts.ini"
[Shutdown]
0CmdLine=ClearPrintQueue.bat
0Parameters=
PS C:\> Get-Content "C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat"
net stop spooler
del %systemroot%\System32\spool\printers\* /Q /F /S
PS C:\>
Das heißt, der Computer verfügt über alles, was zum tatsächlichen Ausführen des Herunterfahrskripts erforderlich ist, ohne das Netzwerk zu erreichen. Ich habe jedoch festgestellt, dass das Skript nicht ausgeführt wird, wenn eine Netzwerkverbindung fehlt.
Weitere Untersuchungen mit einer Paketerfassung und WireShark scheinen weiterhin zu beweisen, dass der PC das Skript tatsächlich von der SYSVOL-Freigabe herunterzieht (warum! Es befindet sich genau dort auf der Festplatte ...). Die Zeitstempel entsprechen dem Zeitpunkt, zu dem der Computer heruntergefahren wurde .
Mögliche Problemumgehung:
Eine mögliche Problemumgehung, die ich noch nicht getestet habe, besteht darin, den absoluten Pfad des Skripts manuell anzugeben, C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat
anstatt nur ClearPrintQueue.bat
einen relativen Pfad anzugeben . Dies scheint jedoch sehr hackig zu sein und scheint nicht so zu sein, wie es "gemeint" ist, um zu funktionieren. Bevor ich diesen Weg gehe, würde ich gerne sehen, ob jemand eine bessere Idee hat.
Warum ich das überhaupt versuche:
Ich habe mobile Benutzer, die versehentlich auf dem falschen Drucker drucken möchten. Diese werden dann lokal auf jeder Workstation in die Warteschlange gestellt. Wenn der PC an den Standort angeschlossen wird, an dem sich dieser Drucker befindet, kommt eine Flut von Papier aus dem Drucker. Die VPN-Software wird auf der "Benutzer" -Ebene ausgeführt, und daher wird die VPN-Software möglicherweise nicht ausgeführt, wenn sie heruntergefahren werden muss.
Ich versuche, dies zu verringern, indem ich die Druckwarteschlange beim Herunterfahren lösche, damit alte Druckaufträge nicht für immer in der Warteschlange stehen.
start -> run -> gpedit.msc
?