Вы можете использовать групповые политики Windows для выполнения файлов различных скриптов при загрузке/выключении компьютера или входе/выходе пользователя. С помощью GPO вы можете исполнять на компьютерах домена не только классические файлы скриптов (.bat, .cmd, ,vbs), но и Startup/Shutdown/Logon/Logoff скрипты PowerShell (.ps1)
В современных версиях Windows вы можете настроить запуск логон/логоф скриптов PowerShell напрямую из редактора групповых политик (ранее приходилось вызывать ps1 скрипты из bat файлов через параметр исполняемого файла powershell.exe).
Запустите консоль управления доменными политиками GPMC.msc (Group Policy Management сonsole). Создайте новую политику (GPO) и назначьте ее на нужный контейнер с пользователями или компьютерами (можно использовать WMI фильтры GPO для более тонкого нацеливания политики). Перейдите в режим редактирования политики.
Вы должны выбрать раздел GPO для запуска PowerShell скрипта в зависимости от того, когда вы хотите выполнить ваш скрипт.
- Если PS скрипт должен быть запущен при входе пользователя на компьютер (настройка параметров окружения пользователя, программ, например: вы хотите при входе пользователя автоматическое создавать подпись в Outlook на основе данных из пользователя AD, настроить параметры экранной заставки или стартового экрана) или при выходе пользователя, вам нужно перейти в раздел GPO: User Configuration -> Policies -> Windows Settings -> Scripts (Logon / Logoff);
- Если вы хотите запускать скрипт PowerShell при загрузке компьютера (отключение устаревших протоколов: NetBIOS, SMBv1, настройка параметров безопасности компьютера и т.д.) или перед корректным выключением компьютера, вам нужно перейти в секцию GPO с настройками компьютера: Computer Configuration -> Policies -> Windows Settings -> Scripts (Startup / Shutdown).
Запуск PowerShell скрипта при загрузке компьютера с помощью групповой политики
Допустим, нам нужно запускать PowerShell скрипт при загрузке Windows. Для этого нужно выбрать Startup и в открывшемся окне перейди на вкладку PowerShell Scripts.
Теперь нужно скопировать файл с вашим PowerShell скриптом на контроллер домена. Скопируйте ваш файл ps1 в каталог Netlogon на контроллере домена (например,
\\winitpro.ru\netlogon
).
Т.к. мы настраиваем запуск Startup скрипта PowerShell, нужно в разрешениях ps1 файла (или всего каталога Machine\Scripts\Startup) проверить NTFS права доступа на чтение и выполнение (Read & Execute) для группы Domain Computers и/или Authenticated Users .
Теперь нужно нажать кнопку Add и укажите UNC путь к вашему файлу скрипта ps1 в Netlogon.
Если вы запускаете несколько PowerShell скриптов через GPO, вы можете управлять порядком из запуска с помощью кнопок Up/Down.
Для корректного выполнения скриптов PowerShell при загрузке компьютера нужно настроить время задержки перед запуском с помощью политики в разделе Computer Configuration -> Administrative Templates -> System -> Group Policy. Включите политику Configure Logon Script Delay (Настроить задержку сценария входа в систему) и укажите задержку в минутах перед запуском логон-скриптов (достаточное для окончания инициализации и загрузки всех необходимых служб). Обычно достаточно поставить здесь 1-2 минуты.
В Windows Server 2012R2 и Windows 8.1 и выше PowerShell скрипты в GPO запускаются из каталога NetLogon в режиме Bypass. Это означает, что настройки политики запуска сценариев PowerShell игнорируются. Если вы хотите запустить скрипт из другого каталога, или в вашей сети остались клиенты с Windows 7 или Windows Server 2008R2, вам нужно настроить политику выполнения PowerShell скриптов.
По умолчанию в настройках безопасности Windows запрещен запуск PowerShell скриптов. Значение текущей настройки политики запуска сценариев PowerShell можно получить командой Get-ExecutionPolicy. Если политика не настроена, команда вернет Restricted (блокируются любые скрипты). Параметры безопасности запуска PowerShell скриптов можно настроить через политику “Включить выполнение сценариев” / “Turn On Script Execution” (в разделе GPO Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell). Возможные значения политики:
- Allow only signed scripts (AllSigned)– можно запускать только подписанные скрипты PowerShell (“Как подписать скрипт PowerShell?”) –самый лучший сценарий с точки зрения безопасности;
- Allow local scripts and remote signed scripts (RemoteSigned)– можно запускать любые локальные и подписанные удаленные скрипты;
- Allow all scripts (unrestricted) – самый небезопасный вариант, т.к. разрешает запуск любых PowerShell скриптов.
Если вам не подходит не один из предложенных сценариев настройки политики запуска PowerShell скриптов, вы можете запускать PowerShell скрипты в режиме Bypass (скрипты не блокируются, предупреждения не появляются).
Для этого PowerShell скрипт нужно запускать из секции Startup -> Scripts. В этой секции вы можете настроить запуск ps1 сценария с помощью создания обычного Startup скрипта, запускающего исполняемый файл powershell.exe (по аналогии со сценарием, описанным в статье). Укажите:
- Script name:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe
- Script Parameters:
-Noninteractive -ExecutionPolicy Bypass –Noprofile -file %~dp0MyPSScript.ps1
%~dp0
при запуске на клиенте автоматически преобразуются в UNC путь до каталога со скриптом на SYSVOL.В данном случае вы принудительно разрешили запуск любого (даже ненадежного) скрипта PowerShell с помощью параметра Bypass.
Перезагрузите компьютер, чтобы обновить настройки GPO и проверьте, что ваш PowerShell скрипт запустился после загрузки.
Выполнить PowerShell скрипт при входе пользователя в Windows
Рассмотрим сценарий автоматического запуска PowerShell скрипта при входе пользователя в Windows (или при выходе).
Если вам нужно запустить скрипт не при загрузке компьютера, а после входа пользователя в Windows (для каждого пользователя компьютера), вам нужно привязать GPO к OU Active Directory с пользователями. В этом случае PowerShell нужно настроить в следующем разделе User Configuration вашей GPO
В этом примере для теста я буду использовать простой PowerShell скрипт, который пишет в текстовый лог файл время входа пользователя.
- Скопируйте файл скрипта PowerShell в каталог
\\winitpro.ru\NETLOGON\
на контроллере домена AD - Перейдите в раздел User Configuration -> Policies -> Windows Settings -> Scripts -> Logon;
- Перейдите на вкладку PowerShell Scripts и добавьте ваш PS1 файл скрипта (используйте UNC путь, например
\\winitpro.ru\NETLOGON\UserLog.ps1
); - Выполните логофф пользователя на целевом компьютере и выполните вход;
- Ваш PowerShell скрипт будет запущен автоматически через GPO при входе пользователя;
- Вы можете убедится, что логон скрипт выполнен успешно под пользователем по событию с Event ID 5018 в журнале Microsoft-Windows-GroupPolicy/Operational Event Viewer:
Completed Logon script for winitpro\kbuldogov in 11 seconds.
Если вы хотите, чтобы пользователь не мог получить доступ к своему рабочему столу до окончания работы скрипта, нужно включить параметр Run logon scripts synchronously = Enable (Computer Configuration\Administrative Templates\System\Logon). В этом случае explorer не закончится, пока не отработают все политики и логон скрипты (это увеличивает время входа!).
Обратите внимание, что скрипт выполняется с правами текущего пользователя. Если у пользователя есть права администратора на компьютере и на него действуют политики User Account Control (UAC), PowerShell скрипт не сможет внести изменения, требующие повышенных привилегий.
Для запуска PowerShell скриптов с привилегированными правами при входе простых пользователей, можно использовать назначенные задания планировщика. Для этого нужно:
- Создать задание Task Scheduler в разделе User Configuration -> Preferences -> Control Panel Settings -> Scheduled Task;
- На вкладке General указать что задание запускается от имени пользователя
%LogonDomain%\%LogonUser
и включите опциюRun with highest privileges
; - На вкладке Trigger укажите, что задание должно запускаться At log on;
- И на вкладке Actions укажите путь к вашему PowerShell скрипту:
Action: Start a program
Program/Script:
C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe
Add Arguments (optional):
-ExecutionPolicy Bypass -command "& \\winitpro.ru\Netlogon\yourscript.ps1"
Такой PowerShell скрипт будет запускаться с правами администратора (если пользователь добавлен в группу локальных администраторов Windows).
Некоторые скрипты нужно запускать для каждого пользователя только один раз при первом входе на компьютер (инициализация рабочего окружения, копирование папок или конфигурационных файлов, создание ярлыков и т.д.). В одной из статей мы рассматривали cпособ запуска логон скрипт через GPO только один раз.
Скрипт запустится в режиме bypass независимо от того где он лежит, в папке с политикой или в какой нибудь шаре?
Да, ведь ExecutionPolicy это атрибут сессии, которую мы запускаем, а не файла.
На что мне повесить скрипт который должен выполниться во время работы ОС, не старта или логина.
Закинуть задание планировщика с нужными настройками через Group Policy Preferences
Как сделать чтобы пользователь не мог войти в систему пока не закончится выполнение скрипта
Можно настроить групповую политику Run logon scripts synchronously = Enable (Computer Configuration\Administrative Templates\System\Logon\)
В этом случае explorer не запустится, пока не отработают все логон скрипты.
а есть варианты раскидывать одинаковые политики на кучу компов без сети?
да, без домена и вообще без сети
(варианты тыкать ручками через gpedit.msc мне не нравится, при наборе политик более 100 строк )
хотелось бы что то типа какого то батника
приходилось видеть файлы в формате adm, admx, но как их создавать — пока непонятно
оно? https://winitpro.ru/index.php/2015/04/17/perenos-nastroek-lokalnoj-gruppovoj-politiki-mezhdu-kompyuterami/
Для отладки оибок в скриптах, хапускаемых через GPO использую такую обертку:
try{
# your code goes here
}
catch{
$exception = $_.Exception.Message
Out-File -FilePath ‘c:\myscript.log’ -Append -InputObject $exception
}
у меня заработал стартап скрипт компьютерной GPO без отключения execution policy только после копирования скрипта на локальный компьютер. С UNC путем скрипт в принципе напрямую не запускался:
del c:\windows\temp\my.ps1
copy \\domain\netlogon\SCRIPTS\my.ps1 c:\windows\temp\ /Z /Y
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File c:\windows\tempmy.ps1
del c:\windows\temp\my.ps1
Пока вот это не сделал не заработало https://robwillis.info/2017/10/powershell-scripts-fail-when-deployed-via-group-policy-as-startup-scripts-with-event-id-1055-and-1130/
Включил политику Computer Configuration > Policies > Administrative Templates > System > Group Policy -> “Specify startup policy processing wait time”- 60 sec
чтото не до конца понимаю вот тут:
Символы %~dp0 при запуске на клиенте автоматически преобразуются в UNC путь до каталога со скриптом на SYSVOL.
а если мой файл скрипта лежит гдето на шаре?
как тогда будет выглядеть эта строка?
Script Parameters: -Noninteractive -ExecutionPolicy Bypass –Noprofile -file %~dp0MyPSScript.ps1
Просто укажите UNC путь к файлу:
Script Parameters: -Noninteractive -ExecutionPolicy Bypass –Noprofile -file \\fs1\share\MyPSScript.ps1
при загрузке компьютера, из под какой учетки запускается батник или скрипт?
если он прописан тут:
Computer Configuration -> Policies -> Windows Settings -> Scripts (Startup / Shutdown).
от имени SYSTEM?
Да, скрипт будет запускаться от имени компьютера (SYSTEM)
logon скрипты в active directory gpo можно расположить в папке \SysVol\domain.local\netlogon, а можно в \SysVol\domain.local\Policies\{guid}\User\Scripts\Logon
какая разница между этими двумя способами? Не вполне понятно, когда какой способ выбрать.
Включить параметр Run logon scripts synchronously = Enable (Computer Configuration\Administrative Templates\System\Logon).
Исправить путь в GPO на:
Computer Configuration\Administrative Templates\System\Scripts
Подскажите пожалуйста. Для планировщика есть аналог %LogonDomain%\%LogonUser но только на локальных пользователей сервера?
Разобрался, надо просто указать локальную группу «Пользователи»
Начиная с Win 8.1/2012r2 клиент Group Policy ждет 5 минут прежде чем выполнить лого скрипты. Это бывает неудобно.
МОжно исправить с помощью параметра GPO: Local Computer Policy > Computer Configuration > Administrative Templates > System > Group Policy > Configure Logon Script Delay -> задать 0.
Если при запуске логон скрипта от имени компьютера появляется ошибка Event ID 1130 с описанием
Startup script failed
, нужно включить политикуComputer Config > Admin Templates > System > Logon -> Always wait for the network at computer startup and logon
По умолчанию логон скрипты в GPO применятся синхронно (последовательно), это сильно увеличивает время входа в систему. Как то можно сделать чтобы они выполнялись параллельно?
Начиная с Windows Vista/2008 логон скрипты применяются как раз таки асинхронно. Возможно вам просто нужно оптимизиорвать скрипты: упростить логику, убрать сложные wmi/ldap запросы.
Возможно дело и не в скриптах. Вот инструкция по анализу медленного применения GPO на клиентах https://winitpro.ru/index.php/2017/01/20/diagnostika-dolgogo-primeneniya-politik-v-windows/