如果工作站未连接到网络,则不会运行关闭脚本

Per*_*rgk 9 windows active-directory group-policy batch

我需要在每次系统关闭时运行批处理脚本,无论计算机是否连接到网络。(问题应该无关紧要,但有问题的脚本会清除机器的打印队列。

但是,当我使用下面的这种方法时,当 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:\>
Run Code Online (Sandbox Code Playgroud)

在调查本地 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:\>
Run Code Online (Sandbox Code Playgroud)

调查scripts.iniClearPrintQueue.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:\>
Run Code Online (Sandbox Code Playgroud)

即计算机拥有实际运行关机脚本所需的一切,而无需连接到网络。但是,我观察到脚本在缺少网络连接时似乎无法运行。

使用数据包捕获和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 软件很可能不会运行。

我试图通过在关机时清除打印队列来缓解这种情况,这样古老的打印作业就不会永远排在队列中。

Swi*_*one 10

这是设计使然。微软从未说过在计算机离线时会执行启动/关闭脚本。

您找到的本地缓存不是用于脱机处理,而是为了避免客户端压倒域控制器。您可以在此处找到有关此特定点的更多详细信息:组策略核心协议: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.

然后,创建另一个首选项(“文件”而不是“计划任务”)以将您的脚本复制到计算机上安全的本地路径中(用户不得在此文件中写入以避免权限提升)。如果需要,您可以使用其他东西来复制文件,但不要忘记在计划任务首选项中引用它。

  • 它不一定是计划任务,您仍然可以使用关闭脚本,该脚本只需要在本地磁盘上而不是坐在 GPO 中。 (3认同)
  • 感谢您提供链接,它们确实阐明了为什么组策略会这样做。根据我的理解,这告诉我无论如何都没有充分的理由将脚本放在 GPO 文件夹中。把它放在外面会阻止它不必要地复制到每个工作站,把它放在里面没有任何好处。我最终使用 GPO 中的“文件”将脚本从网络共享显式复制到机器上,然后使用绝对文件路径来执行它。我最终没有使用计划任务。也感谢您提供有关安全性的提示。 (2认同)