Le script d'arrêt ne s'exécute pas si le poste de travail n'est pas connecté au réseau

8

Je dois exécuter un script de commandes à chaque fois qu'un système est arrêté, que l'ordinateur soit connecté au réseau ou non. (Cela ne devrait pas avoir d'importance pour la question, mais le script en question efface la file d'attente d'impression de la machine.

Cependant, je ne peux pas exécuter ce script lorsque le PC est hors ligne du réseau, lorsque j'utilise cette méthode ci-dessous.

Je pourrais également ajouter que le PC en question exécute Windows 10 Pro x64 (version 1809). Le contrôleur de domaine exécute Windows Server 2008 R2, et c'est également là que j'ai exécuté gpedit.msc.

Ce que j'ai fait jusqu'à présent:

  • Création d'un objet de stratégie de groupe Active Directory avec un script d'arrêt de machine.
  • Ajout du script au dossier GPO sur le SYSVOL .
  • Confirmé que cet objet de stratégie de groupe est en effet téléchargé sur le disque dur du poste de travail en question et doit donc être accessible hors ligne.
  • Les chemins spécifiés dans le GPO sont relatifs, pas absolus.

Ce que je veux arriver:

  • Lorsque le PC est arrêté, le ClearPrintQueue.batscript est exécuté indépendamment du fait que le PC dispose actuellement d'une connexion réseau ou non.

Que se passe-t-il réellement:

  • Lorsque le PC est arrêté, le ClearPrintQueue.batscript n'est exécuté que si le PC peut actuellement atteindre le partage SYSVOL sur le réseau.

Détails:

Ce que j'ai fait, c'est créer un objet de stratégie de groupe dans le domaine et le lier à une unité d'organisation de test qui contient la machine en question.

J'ai modifié l'objet de stratégie de groupe et accédé à Configuration ordinateur -> Stratégies -> Paramètres Windows -> Scripts (démarrage / arrêt) -> Arrêt

Les propriétés d'arrêt comme ci-dessous:

Propriétés d'arrêt

En cliquant sur Afficher les fichiers ... l'explorateur s'ouvre pour révéler le dossier\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown

Le contenu de ce dossier et du fichier ClearPrintQueue.bat sont les suivants:

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:\>

Lorsque j'examine un PC local, je peux constater que le script est bien copié dans le magasin GPO local du PC:

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:\>

En recherchant dans scripts.iniet ClearPrintQueue.batsur le disque local du PC, nous trouvons:

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:\>

C'est-à-dire que l'ordinateur a tout ce dont il a besoin pour exécuter le script d'arrêt sans atteindre le réseau. Mais pourtant, j'ai observé que le script ne semble pas s'exécuter lorsqu'une connexion réseau est manquante.

Une enquête plus approfondie utilisant une capture de paquets et WireShark semble prouver que le PC tire en fait le script du partage SYSVOL (pourquoi! Il est juste là sur le disque ...) Les horodatages correspondent au moment où l'ordinateur a été arrêté .

Capture de paquets Wireshark montrant comment le script est extrait du disque au moment de l'arrêt

Solution possible:

Une solution de contournement possible que je n'ai pas encore testée consiste à spécifier manuellement le chemin absolu du script C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.batplutôt que de simplement spécifier ClearPrintQueue.batcomme chemin relatif. Cela semble très hacky cependant, et il ne semble pas que ce soit "censé" fonctionner. Avant de poursuivre dans cette voie, j'aimerais voir si quelqu'un d'autre a une meilleure idée.

Pourquoi j'essaie même de faire ça:

J'ai des utilisateurs mobiles qui aiment accidentellement imprimer sur la mauvaise imprimante, et ceux-ci sont ensuite mis en file d'attente localement sur chaque poste de travail, puis lorsque le PC est connecté au site où se trouve cette imprimante, un déluge de papier sort de l'imprimante. Le logiciel VPN est exécuté au niveau "utilisateur", et donc le logiciel VPN pourrait ne pas fonctionner lorsqu'il est temps de le fermer.

J'essaie d'atténuer cela en effaçant la file d'attente d'impression à l'arrêt, afin que les anciens travaux d'impression ne restent pas dans la file d'attente pour toujours.

Per von Zweigbergk
la source
Et si vous ajoutez ce script aux stratégies locales ? Par exemple start -> run -> gpedit.msc?
Lenniey
@Lenniey Merci, mais l'utilisation des politiques locales n'est pas pratique dans mon environnement, j'ai environ 35 machines sur lesquelles j'ai besoin de fonctionner.
Per von Zweigbergk

Réponses:

9

C'est par conception. Microsoft n'a jamais dit que les scripts de démarrage / arrêt seront exécutés lorsque l'ordinateur est hors ligne.

Le cache local que vous avez trouvé n'est pas là pour le traitement hors ligne, mais pour éviter que les clients ne submergent les contrôleurs de domaine. Vous pouvez trouver plus de détails sur ce point particulier ici: Protocole de base de la stratégie de groupe: cache de la version GPO

En outre, l' extension de script de stratégie de groupe nécessite que le client soit en mesure de valider la source du script. Et comme vous pouvez le voir sur le diagramme suivant, le serveur GP (contrôleur de domaine) est au cœur de l'extension de scripts de stratégie de groupe:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gpscr/ms-gpscr_files/image001.png

Afin de résoudre votre problème, je vous suggère d'essayer ceci à la place:

Création d' un groupe de travail via Préférences politiques planifiées ( Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks) et créer une New Scheduled Task (at Least Windows 7), configurer la tâche à exécuter comme System, ajoutez le déclencheur suivant: On disconnect from user session.

Ensuite, créez une autre préférence ("Fichier" au lieu de "Tâche planifiée") pour copier votre script dans un chemin local sécurisé sur les ordinateurs (les utilisateurs ne doivent pas pouvoir écrire dans ce fichier pour éviter une escalade de privilèges). Vous pouvez utiliser autre chose pour copier le fichier si vous le souhaitez, mais n'oubliez pas de le référencer dans la préférence de tâche planifiée.

Swisstone
la source
3
Il n'est pas nécessaire que ce soit une tâche planifiée, vous pouvez toujours utiliser un script d'arrêt, le script doit simplement être sur le disque local plutôt que d'être assis dans le GPO.
Harry Johnston
2
Merci pour les liens, ils expliquent en effet pourquoi la stratégie de groupe fait ce qu'elle fait. D'après ma compréhension, cela me dit qu'il n'y a pas de bonne raison de mettre un script à l'intérieur d'un dossier GPO de toute façon. Le mettre à l'extérieur l'empêche d'être copié inutilement sur chaque poste de travail, et le mettre à l'intérieur ne confère aucun avantage. J'ai fini par utiliser un "fichier" dans GPO pour copier explicitement le script sur la machine à partir d'un partage réseau, puis utiliser un chemin de fichier absolu pour l'exécuter. Je n'ai pas fini par utiliser une tâche planifiée. Merci aussi pour le conseil sur la sécurité.
Per von Zweigbergk