Per*_*rgk 9 windows active-directory group-policy batch
我需要在每次系统关闭时运行批处理脚本,无论计算机是否连接到网络。(问题应该无关紧要,但有问题的脚本会清除机器的打印队列。
但是,当我使用下面的这种方法时,当 PC 与网络脱机时,我无法运行此脚本。
我还可以补充一点,有问题的 PC 运行的是 Windows 10 Pro x64(版本 1809)。域控制器运行的是 Windows Server 2008 R2,这也是我运行gpedit.msc.
到目前为止我所做的:
我想要发生的事情:
ClearPrintQueue.bat无论 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.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:\>
Run Code Online (Sandbox Code Playgroud)
即计算机拥有实际运行关机脚本所需的一切,而无需连接到网络。但是,我观察到脚本在缺少网络连接时似乎无法运行。
使用数据包捕获和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为相对路径。不过,这似乎很hacky,并且似乎并不是它“打算”工作的方式。在我走这条路之前,我很想看看其他人是否有更好的主意。
为什么我什至试图这样做:
我有喜欢不小心打印到错误打印机的移动用户,然后这些用户在每个工作站上本地排队,随后当 PC 连接到该打印机所在的站点时,大量纸张从打印机中出来。VPN 软件在“用户”级别运行,因此当需要关闭时,VPN 软件很可能不会运行。
我试图通过在关机时清除打印队列来缓解这种情况,这样古老的打印作业就不会永远排在队列中。
Swi*_*one 10
这是设计使然。微软从未说过在计算机离线时会执行启动/关闭脚本。
您找到的本地缓存不是用于脱机处理,而是为了避免客户端压倒域控制器。您可以在此处找到有关此特定点的更多详细信息:组策略核心协议:GPO 版本缓存
此外,组策略脚本扩展要求客户端必须能够验证脚本的来源。如下图所示,GP 服务器(域控制器)是组策略脚本扩展的核心:
为了解决你的问题,我建议你试试这个:
通过组策略首选项 ( Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks)创建计划任务并创建一个New Scheduled Task (at Least Windows 7),将任务配置为运行为System,添加以下触发器:On disconnect from user session.
然后,创建另一个首选项(“文件”而不是“计划任务”)以将您的脚本复制到计算机上安全的本地路径中(用户不得在此文件中写入以避免权限提升)。如果需要,您可以使用其他东西来复制文件,但不要忘记在计划任务首选项中引用它。
| 归档时间: |
|
| 查看次数: |
1805 次 |
| 最近记录: |