Логон (логоф) скрипты групповых политик позволяют запустить bat или PowerShell скрипт при загрузке компьютера или входе (выходе) пользователя. В некоторых случаях администратору нужно, чтобы определенный скрипт (команда) запускались для каждого пользователя или компьютера только один раз, и не отрабатывал при следующих входах.
Одним из вариантов решения данной проблемы может быть использование стандартного логон скрипта, который проверяет наличие определенного флага на компьютере. Этом может быть параметр в реестре или текстовый файл на диске
Например, вы хотите, чтобы определенный код выполнялся только один раз при первом входе пользователя на компьютер.
- Создайте следующий bat файл (corp_user_init.bat) и поместите его в каталог %SystemRoot%\SYSVOL\sysvol\<domain name>\scripts на котроллере домена:
@echo off
IF EXIST C:\Users\%UserName%\AppData\app_init.txt GOTO END
:APPFLAG
date /t >> C:\Users\%UserName%\AppData\app_init.txt
time /t >> C:\Users\%UserName%\AppData\app_init.txt
REM Здесь добавьте код вашего скрипта, который нужно выполнить один раз
:ENDДанный скрипт при первом запуске создает небольшой текстовый файл в профиле пользователя. При следующем запуске скрипта через GPO, скрипт проверяет есть ли данный файл на диске. Если файл присутствует, значит скрипт уже выполнялся и выполнять код повторно не нужно. - Откройте консоль редактора доменных GPO (
gpmc.msc
); - Создайте новую политику и назначьте ее на OU с пользователями (или компьютерами, но для этого нужно включить режим замыкания групповой политики — Loopback Processing mode);
- Перейдите в раздел User Configuration -> Windows Settings -> Scripts (Logon / Logoff);
- Выберите Logon;
- Нажмите кнопку Add и укажите путь к вашему bat файлу в SYSVOL (
\\winitpro.ru\SysVol\winitpro.ru\scripts
); - После обновления групповых политик на клиенте при входе пользователя будет выполнен ваш скрипт. Убедитесь, что он успешно создал файл app_init.txt в профиле пользователя;Если GPO со скриптом не применилась, используйте утилиту gpresult и методики диагностики из статьи Почему не применяется групповая политика.
- При следующем входе пользователя на компьютер, основной код скрипта не будет выполняьбся. Т.е. по сути скрипт применится к пользователю только один раз.
Другой вариант разового запуска скрипта через GPO предполагает использование разового задания планировщика Task Scheduler.
- Поместите ваш файл скрипта (это может быть bat или PowerShell) в каталог Sysvol на контроллере домена (\\<ваш_домен>\SysVol\<ваш_домен>\scripts);
- Создайте новую GPO, назначьте ее на OU с пользователями и откройте ее настройки;
- Перейдите в раздел Preferences -> Control Panel Settings -> Scheduled Task -> New -> Immediate Task (At least Windows 7);
- Укажите имя задания;
- Перейдите на вкладку Actions, нажмите New и укажите полный UNC путь к вашему скрипту в SYSVOL;
- Затем перейдите на вкладку Common и включите опцию Apply once and do not reapply;
- Такое задание также отработает на компьютере только один раз при первом входе пользователя.
А какие есть варианты выполнить скрипт один раз при первом логине пользователя и не выполнять при логинах на других компьютерах.
читайте про loopback policy.
Если есть AD, наверно лучше смотреть в сторону использования для этого како-го нибудь extensionattribute или description у пользователя.
Логига аналогичная — при первом выполеннии скрипта выставить пользователю флаг в AD через PowerShell Set-ADUser (https://winitpro.ru/index.php/2020/08/31/set-aduser-izmenit-svoystva-polzovatelya-v-active-directory-powershell/). При следующих запусках проверять наличие этого флага.
Вот это неплохо. Попробую. Спасибо.
Во 2-м варианте GPO запустит скрипт, но никак не узнает успешно или нет. Я ошибаюсь?
Да, в GPO ничего не хранится.
Отследить статус можно только по журналу событий на компьютере.
Добрый день.
А Вы уверены что нужны строчки в bat-файле:
IF EXIST C:\Users\%UserName%\AppData\app_init.txt GOTO APPFLAG
:APPFLAG
Теперь строка :APPFLAG лишняя :/
это почему? что изменилось?
Еще можно использовать такую штуку как ActiveSetup.
Да, кстати. Забыл про эту штуку.
Тоже вполне можно использоваться — разливкой через ветку реестра
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
то же самое можно сделать через GPP Immediate Scheduled Task. такое задание запустится один раз, причем не нужно ждать перезагрузки/компьютера или выхода/входа пользователя.
скрипт powershell выполнится при следующем обновлении GPO
Здравствуйте. Что делать если GPO применяется, но скрипт отрабатывается только с правами Администратора, «Прошедшие проверку» — чтение?
Скрипт вручную от пользователя работает? без повышения привелегий?
При запуске скрипта через конфигурацию пользователя он отрабабывает с правами текущего пользователя.
Нет, не работает, только при запуске с правами администратора
Значит через GPO пользователя его не запустить. Смотрите логон скрипты в Computer Configuration или задания планировщика
https://winitpro.ru/index.php/2022/05/11/zadanie-planirovshhika-gpo/
Настраивал в Computer Configuration и в User Configuration результат — «Отказано в доступе».
WinServ 2012, конфигурация пользователя
почему то у меня файл app_init.txt не создает, но все что после REM выполняется в батнике
правда у меня скрипт отрабатывает не в Юзер а в компьютер конфигурейшн
У Вас на последнем скрине есть опция Item-Level Targeting
с помощью задания её параметров можно достаточно гибко регулировать исполнение задания-скрипта.
Для примера, можно проверять наличие/отсутствие файла либо директории или другие параметры компьютера.
Спасибо за Ваш труд, очень много полезной информации практического характера, которая помогает в ежедневной работе.
Да, как вариант Item-Level Targeting можно использовать для проверки наличия некоего флага на компьютере.