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

8

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

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

Могу также добавить, что рассматриваемый компьютер работает под управлением 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 (почему! Он прямо на диске ...) Отметки времени соответствуют моменту выключения компьютера ,

Захват пакетов Wireshark, показывающий, как скрипт отключается с диска во время завершения работы

Возможное решение:

Один из возможных обходных путей, который я еще не тестировал, заключается в ручном указании абсолютного пути к сценарию, 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?
Леннией
@Lenniey Спасибо, но использование локальных политик в моей среде нецелесообразно, у меня около 35 машин, на которых мне нужно это запустить.
Per von

Ответы:

9

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

Локальный кеш, который вы обнаружили, предназначен не для автономной обработки, а для того, чтобы клиенты не перегружали контроллеры домена. Подробнее об этом можно прочитать здесь: Основной протокол групповой политики: кэш версии GPO.

Кроме того, расширение сценария групповой политики требует, чтобы клиент мог проверять источник сценария. И как вы можете видеть на следующей диаграмме, сервер GP (контроллер домена) является ядром расширения сценариев групповой политики:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gpscr/ms-gpscr_files/image001.png

Чтобы решить вашу проблему, я предлагаю вам попробовать это:

Создание запланированного задания с помощью Политики Настройки группы ( Computer Configuration -> Preferences -> Control Panel -> Scheduled Tasks) и создать New Scheduled Task (at Least Windows 7), настроить задачу для запуска в качестве System, добавьте следующий триггер: On disconnect from user session.

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

Swisstone
источник
3
Это не должно быть запланированным заданием, вы все равно можете использовать сценарий завершения работы, сценарий должен находиться только на локальном диске, а не в GPO.
Гарри Джонстон
2
Спасибо за ссылки, они действительно объясняют, почему групповая политика делает то, что делает. Насколько я понимаю, это говорит о том, что в любом случае нет веской причины помещать скрипт в папку объекта групповой политики. Если вы поместите его наружу, копирование на каждую рабочую станцию ​​излишне прекратится, а его размещение внутри не принесет никаких преимуществ. В итоге я использовал «Файл» в объекте групповой политики, чтобы явно скопировать сценарий на компьютер из общего сетевого ресурса, а затем использовать абсолютный путь к файлу для его выполнения. Я не закончил тем, что использовал запланированное задание. Спасибо за совет о безопасности также.
Per von