コンピューターがネットワークに接続されているかどうかに関係なく、システムがシャットダウンされるたびにバッチスクリプトを実行する必要があります。(質問には関係ありませんが、問題のスクリプトはマシンの印刷キューをクリアします。
ただし、以下の方法を使用すると、PCがネットワークからオフラインのときにこのスクリプトを実行できません。
また、問題のPCがWindows 10 Pro x64(バージョン1809)を実行していることも付け加えておきます。ドメインコントローラーはWindows Server 2008 R2を実行しており、ここでも私が実行しましたgpedit.msc
。
これまでに行ったこと:
- マシンシャットダウンスクリプトを使用してActive Directory グループポリシーオブジェクトを作成しました。
- SYSVOLの GPOフォルダーにスクリプトを追加しました。
- このGPOが実際に問題のワークステーションのハードディスクにダウンロードされているため、オフラインでアクセスできることを確認しました。
- GPOで指定されたパスは相対パスであり、絶対パスではありません。
私が起こりたいこと:
- PCがシャットダウンされると、
ClearPrintQueue.bat
スクリプトはPCが現在ネットワークに接続されているかどうかに関係なく実行されます。
実際に起こること:
- PCがシャットダウンされると、
ClearPrintQueue.bat
スクリプトはPCが現在ネットワーク経由でSYSVOL共有に到達できる場合にのみ実行されます。
詳細:
私が行ったことは、ドメイン内にグループポリシーオブジェクトを作成し、問題のマシンを含むテストOUにリンクすることです。
GPOを編集して、[ コンピューターの構成] -> [ ポリシー] -> [ Windowsの設定] -> [ スクリプト(スタートアップ/シャットダウン)] -> [シャットダウン]に移動しました
シャットダウン特性下のあたりのように:
[ ファイルの表示 ]をクリックすると、エクスプローラーが開いてフォルダーが表示されます\\example.com\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown
このフォルダーとClearPrintQueue.batファイルの内容は次のとおりです。
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:\>
ローカルPCを調査すると、スクリプトが実際にPCのローカルGPOストアにコピーされていることがわかります。
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:\>
調査scripts.ini
し、ClearPrintQueue.bat
我々は見つけるPCのローカルディスク上に:
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:\>
つまり、コンピュータには、ネットワークに手を伸ばさずにシャットダウンスクリプトを実際に実行するために必要なものがすべて揃っています。しかし、ネットワーク接続がない場合、スクリプトが実行されていないように見えます。
パケットキャプチャとWireSharkを使用してさらに調査すると、PCが実際にスクリプトをSYSVOL共有からプルダウンしていることが証明されているようです(理由!ディスク上にあるので...)タイムスタンプは、コンピューターがシャットダウンされた時期に対応しています。
可能な回避策:
まだテストしていない回避策の1つとして、相対パスとしてC:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat
指定するのではなく、スクリプトの絶対パスを手動で指定する方法がありClearPrintQueue.bat
ます。ただし、これは非常にハッキリしているように見え、動作するように「意味がある」ようには見えません。そのルートを進む前に、他の誰かがより良いアイデアを持っているかどうかを確認したいと思います。
なぜこれをやろうとしているのか:
私が誤って間違ったプリンターに印刷したいモバイルユーザーがいて、それらが各ワークステーションのローカルでキューに入れられ、その後PCがそのプリンターのあるサイトに接続されると、大量の紙がプリンターから出てきます。VPNソフトウェアは「ユーザー」レベルで実行されるため、シャットダウンのときにVPNソフトウェアが実行されていない可能性があります。
シャットダウン時に印刷キューをクリアしてこれを緩和しようとしています。これにより、古い印刷ジョブがキューに永遠に留まらないようにします。
start -> run -> gpedit.msc
?