コンピューターがネットワークに接続されているかどうかに関係なく、システムがシャットダウンされるたびにバッチスクリプトを実行する必要があります。 (問題にはなりませんが、問題のスクリプトはマシンの印刷キューをクリアします。
ただし、以下の方法を使用すると、PCがネットワークからオフラインのときにこのスクリプトを実行できません。
また、問題のPCがWindows 10 Pro x64(バージョン1809)を実行していることも付け加えておきます。ドメインコントローラーはWindows Server 2008 R2を実行しており、ここでもgpedit.msc
を実行しています。
これまでに行ったこと:
私が起こりたいこと:
ClearPrintQueue.bat
スクリプトが実行されます。実際に何が起こるか:
ClearPrintQueue.bat
スクリプトは、PCが現在[〜#〜] sysvol [〜#〜]共有に到達できる場合にのみ実行されます。通信網。詳細:
私が行ったことは、ドメイン内にGroup Policy Objectを作成し、問題のマシンを含むTest OUにリンクすることです。
GPOを編集してComputer Configuration->Policies->Windows設定->スクリプト(スタートアップ/シャットダウン)->シャットダウン
以下のようにShutdown Properties:
Show Files ...をクリックすると、エクスプローラーが開き、フォルダー\\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にコピーされていることがわかります。slocal GPO store:
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:\>
PCのローカルディスク上のscripts.ini
およびClearPrintQueue.bat
を調査します。
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ソフトウェアが実行されていない可能性があります。
シャットダウン時に印刷キューをクリアすることでこれを軽減し、古い印刷ジョブがキューに永遠に留まらないようにしています。
仕様によるものです。マイクロソフトは、コンピューターがオフラインのときに起動/シャットダウンスクリプトが実行されるとは決して言っていません。
見つけたローカルキャッシュはオフライン処理用ではありませんが、クライアントがドメインコントローラーに負荷をかけないようにするためです。この特定のポイントの詳細については、こちらをご覧ください。 グループポリシーコアプロトコル:GPOバージョン)のキャッシュ
さらに、 グループポリシースクリプト拡張 では、クライアントがスクリプトのソースを検証できる必要があります。次の図に示すように、GPサーバー(ドメインコントローラー)はグループポリシースクリプト拡張機能の中核です。
あなたの問題を解決するために、代わりにこれを試すことをお勧めします:
グループポリシーの基本設定(_Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks
_)でスケジュールされたタスクを作成し、New Scheduled Task (at Least Windows 7)
を作成して、System
として実行するようにタスクを構成し、次のトリガーを追加します:_On disconnect from user session
_。
次に、別の設定(「スケジュールされたタスク」ではなく「ファイル」)を作成して、スクリプトをコンピューターの安全なローカルパスにコピーします(特権の昇格を避けるために、ユーザーがこのファイルに書き込むことはできません)。必要に応じて、他の何かを使用してファイルをコピーできますが、スケジュールされたタスク設定で参照することを忘れないでください。