У меня есть требование запускать пакетный сценарий каждый раз при выключении системы, независимо от того, подключен ли компьютер к сети или нет. (Это не имеет значения для вопроса, но рассматриваемый сценарий очищает очередь печати устройства.
Однако я не могу запустить этот скрипт, когда компьютер отключен от сети, когда я использую этот метод ниже.
Я мог бы также добавить, что рассматриваемый компьютер работает под управлением Windows 10 Pro x64 (версия 1809). Контроллер домена работает под управлением Windows Server 2008 R2, и здесь я также запускал gpedit.msc
.
Что я сделал до сих пор:
Чего я хочу:
ClearPrintQueue.bat
Скрипт запускается независимо от того, есть ли у ПК в настоящее время сетевое соединение или нет.Что на самом деле происходит:
ClearPrintQueue.bat
скрипт запускается только в том случае, если ПК в настоящее время может достичь SYSVOL поделиться по сети.Подробности:
Что я сделал, так это создал Объект групповой политики в домене и свяжите его с тестовым подразделением, содержащим рассматриваемый компьютер.
Я отредактировал 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:\>
При исследовании локального ПК я обнаружил, что сценарий действительно скопирован в локальное хранилище 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 вполне может не работать, когда пришло время выключения.
Я пытаюсь смягчить это, очищая очередь печати при завершении работы, чтобы старые задания на печать не оставались в очереди навсегда.
Это по замыслу. Microsoft никогда не говорила, что сценарии запуска / выключения будут выполняться, когда компьютер отключен.
Найденный вами локальный кеш предназначен не для автономной обработки, а для того, чтобы клиенты не перегружали контроллеры домена. Вы можете найти более подробную информацию об этом конкретном моменте здесь: Основной протокол групповой политики: кэш версии GPO
Кроме того, Расширение сценария групповой политики требует, чтобы клиент мог проверить источник скрипта. И как вы можете видеть на следующей диаграмме, сервер GP (контроллер домена) является ядром расширения сценариев групповой политики:
Чтобы решить вашу проблему, я предлагаю вам попробовать следующее:
Создайте запланированную задачу с помощью настроек групповых политик (Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks
) и создать New Scheduled Task (at Least Windows 7)
, настройте задачу для запуска как System
добавьте следующий триггер: On disconnect from user session
.
Затем создайте другое предпочтение («Файл» вместо «Запланированное задание»), чтобы скопировать сценарий по защищенному локальному пути на компьютерах (пользователи не должны иметь возможность писать в этот файл, чтобы избежать повышения привилегий). Вы можете использовать что-нибудь еще для копирования файла, если хотите, но не забудьте указать на него ссылку в настройках запланированной задачи.