У меня есть требование запускать пакетный скрипт каждый раз, когда система выключается, независимо от того, подключен ли компьютер к сети или нет. (Это не должно иметь значения для вопроса, но рассматриваемый скрипт очищает очередь печати машины.
Однако я не могу запустить этот сценарий, когда ПК не подключен к сети, когда я использую этот метод ниже.
Могу также добавить, что рассматриваемый компьютер работает под управлением Windows 10 Pro x64 (версия 1809). Контроллер домена работает под управлением Windows Server 2008 R2, и это также, где я запустил gpedit.msc
.
Что я сделал до сих пор:
- Создан объект групповой политики Active Directory со сценарием выключения компьютера.
- Добавлен скрипт в папку GPO на SYSVOL .
- Подтвердили, что этот объект GPO действительно загружен на жесткий диск рассматриваемой рабочей станции и поэтому должен быть доступен в автономном режиме.
- Пути, указанные в объекте групповой политики, являются относительными, а не абсолютными.
Что я хочу, чтобы произошло:
- Когда компьютер выключен,
ClearPrintQueue.bat
сценарий запускается независимо от того, подключен ли компьютер к сети в настоящее время или нет.
Что на самом деле происходит:
- Когда компьютер выключен,
ClearPrintQueue.bat
сценарий запускается только в том случае, если в данный момент компьютер может подключиться к общему ресурсу SYSVOL по сети.
Подробности:
Я создал объект групповой политики в домене и связал его с тестовым подразделением, в котором находится рассматриваемая машина.
Я отредактировал объект групповой политики и перешел к Конфигурация компьютера -> Политики -> Параметры Windows -> Сценарии (запуск / завершение работы) -> Завершение работы
В Shutdown Свойства как согласно ниже:
При нажатии на Показать файлы ... открывается проводник, чтобы открыть папку\\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:\>
При исследовании локального ПК я могу обнаружить, что скрипт действительно копируется в локальное хранилище 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:\>
Исследуя в 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, по- видимому, также доказывает, что ПК фактически вытаскивает сценарий из общего ресурса SYSVOL (почему! Он прямо на диске ...) Отметки времени соответствуют моменту выключения компьютера ,
Возможное решение:
Один из возможных обходных путей, который я еще не тестировал, заключается в ручном указании абсолютного пути к сценарию, C:\Windows\System32\GroupPolicy\DataStore\0\SysVol\example.com\Policies\{1B61F884-9D14-4065-8265-F04FFDE41683}\Machine\Scripts\Shutdown\ClearPrintQueue.bat
а не просто ClearPrintQueue.bat
в качестве относительного пути. Это кажется очень хакерским, и не похоже, как это «предназначено» для работы. Прежде чем я пойду по этому пути, я бы хотел посмотреть, есть ли у кого-нибудь идея получше.
Почему я даже пытаюсь сделать это:
У меня есть мобильные пользователи, которые любят случайно печатать на неправильном принтере, и они затем ставятся в очередь локально на каждой рабочей станции, а затем, когда ПК подключается к месту, где находится этот принтер, из принтера выходит поток бумаги. Программное обеспечение VPN запускается на уровне «пользователя», и, следовательно, программное обеспечение VPN может не работать, когда наступит время выключения.
Я пытаюсь смягчить это путем очистки очереди печати при выключении, чтобы древние задания на печать не оставались в очереди вечно.
start -> run -> gpedit.msc
?