ワークステーションがネットワークに接続されていない場合、シャットダウンスクリプトは実行されません


8

コンピューターがネットワークに接続されているかどうかに関係なく、システムがシャットダウンされるたびにバッチスクリプトを実行する必要があります。(質問には関係ありませんが、問題のスクリプトはマシンの印刷キューをクリアします。

ただし、以下の方法を使用すると、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共有からプルダウンしていることが証明されているようです(理由!ディスク上にあるので...)タイムスタンプは、コンピューターがシャットダウンされた時期に対応しています。

シャットダウン時にスクリプトがディスクからプルダウンされる方法を示すWiresharkパケットキャプチャ

可能な回避策:

まだテストしていない回避策の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
Lenniey

@Lennieyありがとうございますが、私の環境ではローカルポリシーを使用するのは現実的ではありません。これを実行するために必要なマシンは約35台あります。
フォンフォンツヴァイグベルク

回答:


9

仕様によるものです。マイクロソフトは、コンピューターがオフラインのときに起動/シャットダウンスクリプトが実行されるとは決して言っていません。

見つけたローカルキャッシュはオフライン処理用ではありませんが、クライアントがドメインコントローラーを圧倒するのを避けるためです。この特定のポイントの詳細については、こちらをご覧ください:グループポリシーコアプロトコル:GPOバージョンのキャッシュ

さらに、グループポリシースクリプト拡張では、クライアントがスクリプトのソースを検証できる必要があります。次の図に示すように、GPサーバー(ドメインコントローラー)はグループポリシースクリプト拡張機能の中核です。

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

あなたの問題を解決するために、代わりにこれを試すことをお勧めします:

グループポリシーの基本設定(Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks)を使用してスケジュールされたタスクを作成しNew Scheduled Task (at Least Windows 7)、を作成して、タスクをとして実行するように構成しSystem、次のトリガーを追加しますOn disconnect from user session

次に、別の設定(「スケジュールされたタスク」ではなく「ファイル」)を作成して、スクリプトをコンピューターの安全なローカルパスにコピーします(特権の昇格を避けるために、ユーザーがこのファイルに書き込むことはできません)。必要に応じて、他の何かを使用してファイルをコピーできますが、スケジュールされたタスク設定で必ず参照してください。


3
スケジュールされたタスクである必要はありません。シャットダウンスクリプトを使用することもできます。スクリプトは、GPOに座っているのではなく、ローカルディスクにある必要があります。
ハリージョンストン

2
リンクをありがとう、彼らは確かにグループポリシーが何をするのかを実際に解明します。私の理解から、これはとにかくスクリプトをGPOフォルダー内に配置する十分な理由はないことを示しています。外に置くと、不必要に各ワークステーションにコピーされるのを防ぎ、中に入れてもメリットはありません。GPOの「ファイル」を使用してスクリプトをネットワーク共有からマシンに明示的にコピーし、絶対ファイルパスを使用して実行しました。スケジュールされたタスクを使用していませんでした。セキュリティに関するヒントもありがとうございます。
フォンフォンツヴァイグベルク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.