Назад | Перейти на главную страницу

Скрипт выключения не запускается, если рабочая станция не подключена к сети

У меня есть требование запускать пакетный сценарий каждый раз при выключении системы, независимо от того, подключен ли компьютер к сети или нет. (Это не имеет значения для вопроса, но рассматриваемый сценарий очищает очередь печати устройства.

Однако я не могу запустить этот скрипт, когда компьютер отключен от сети, когда я использую этот метод ниже.

Я мог бы также добавить, что рассматриваемый компьютер работает под управлением Windows 10 Pro x64 (версия 1809). Контроллер домена работает под управлением Windows Server 2008 R2, и здесь я также запускал gpedit.msc.

Что я сделал до сих пор:

Чего я хочу:

Что на самом деле происходит:

Подробности:

Что я сделал, так это создал Объект групповой политики в домене и свяжите его с тестовым подразделением, содержащим рассматриваемый компьютер.

Я отредактировал 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.

Затем создайте другое предпочтение («Файл» вместо «Запланированное задание»), чтобы скопировать сценарий по защищенному локальному пути на компьютерах (пользователи не должны иметь возможность писать в этот файл, чтобы избежать повышения привилегий). Вы можете использовать что-нибудь еще для копирования файла, если хотите, но не забудьте указать на него ссылку в настройках запланированной задачи.