无论计算机是否连接到网络,我都要求每次关闭系统时都运行批处理脚本。(该问题无关紧要,但是有问题的脚本会清除机器的打印队列。
但是,当我在下面使用此方法时,当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.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共享中提取了脚本(为什么!它就在磁盘上...)时间戳记与计算机关闭时的时间戳相对应。 。
可能的解决方法:
我尚未测试的一种可能的解决方法是手动指定脚本的绝对路径,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
?