Windows

如果工作站未連接到網路,則關閉腳本不會執行

  • April 24, 2019

無論電腦是否連接到網路,每次系統關閉時我都需要執行批處理腳本。(問題無關緊要,但有問題的腳本會清除機器的列印隊列。

但是,當我在下面使用此方法時,當 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 設置->腳本(啟動/關機) ->關機

關機屬性如下:

關機屬性

點擊*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:s 本地 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:\>

調查PCscripts.iniClearPrintQueue.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 共享中拉下腳本(為什麼!它就在磁碟上……)時間戳對應於電腦關閉的時間.

Wireshark 數據包擷取顯示如何在關機時從磁碟拉下腳本

可能的解決方法:

我尚未測試的一種可能的解決方法是手動指定腳本的絕對路徑,C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat而不僅僅是指定ClearPrintQueue.bat為相對路徑。不過,這似乎很 hacky,並且似乎不是它的“意圖”工作方式。在我走這條路之前,我很想看看是否有人有更好的主意。

為什麼我什至要這樣做:

我有一些移動使用者喜歡不小心列印到錯誤的列印機,然後這些使用者在每個工作站上本地排隊,隨後當 PC 連接到該列印機所在的站點時,大量的紙張從列印機中流出。VPN 軟體在“使用者”級別上執行,因此 VPN 軟體在關閉時很可能不會執行。

我試圖通過在關機時清除列印隊列來緩解這種情況,這樣古老的列印作業就不會永遠坐在隊列中。

這是設計使然。微軟從未說過電腦離線時會執行啟動/關閉腳本。

您找到的本地記憶體不是用於離線處理,而是為了避免客戶端壓倒域控制器。您可以在此處找到有關此特定點的更多詳細資訊:組策略核心協議: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

然後,創建另一個首選項(“文件”而不是“計劃任務”)以將腳本複製到電腦上的安全本地路徑中(使用者不得在此文件中寫入以避免權限升級)。如果需要,您可以使用其他東西來複製文件,但不要忘記在“計劃任務首選項”中引用它。

引用自:https://serverfault.com/questions/964244