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


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:\>

调查PC的本地磁盘scripts.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为相对路径。但是,这似乎很棘手,而且似乎也不是“需要”工作的方式。在我走那条路线之前,我很想看看其他人是否有更好的主意。

为什么我甚至试图这样做:

我有一些移动用户,他们希望意外地使用错误的打印机进行打印,然后将这些用户在每个工作站上本地排队,然后,当PC连接到该打印机所在的站点时,打印机中就会喷出大量纸张。VPN软件在“用户”级别上运行,因此在关机时VPN软件可能未运行。

我正在尝试通过在关机时清除打印队列来减轻这种情况,以使古老的打印作业不会永远停留在队列中。


如果将此脚本添加到本地策略该怎么办?例如start -> run -> gpedit.msc
Lenniey

@Lenniey谢谢,但是在我的环境中使用本地策略并不可行,我大约需要运行35台计算机。
Per von Zweigbergk

Answers:


9

这是设计使然。Microsoft从未说过,当计算机脱机时,启动/关闭脚本将被执行。

您找到的本地缓存不存在用于脱机处理,但要避免客户端使域控制器不堪重负。您可以在此处找到有关此特定点的更多详细信息:组策略核心协议:GPO版本的缓存

此外,组策略脚本扩展要求客户端必须能够验证脚本的来源。如下图所示,GP Server(域控制器)是组策略脚本扩展的核心:

https://docs.microsoft.com/zh-cn/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中使用“文件”将脚本从网络共享显式复制到计算机上,然后使用绝对文件路径执行该脚本。我最终没有使用预定的任务。也感谢您提供有关安全性的提示。
Per von Zweigbergk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.