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.bat
script 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.bat
script 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:
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.ini
et ClearPrintQueue.bat
sur 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é .
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.bat
plutôt que de simplement spécifier ClearPrintQueue.bat
comme 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.
start -> run -> gpedit.msc
?