Наверняка вы замечали, что самый первый вход пользователя в систему занимает несколько больше времени, чем все последующие. Это связано с тем, что при входе к пользователю применяются настройки различных программных продуктов, таких как Microsoft Office, Internet Explorer и т.п. Механизм, реализующий эти настройки, называется Active Setup.
Active Setup предназначается для однократного применения настроек ПО, поэтому для каждого пользователя он отрабатывает только один раз. При последующем входе в систему того же пользователя вы его уже не увидите, зато если в систему зайдет другой пользователь, для него весь процесс повторится.
Эту особенность Active Setup можно использовать в том случае, когда необходимо однократно выполнить какое либо действие, например произвести настройку пользовательского окружения для нового пользователя или установить\обновить ПО.
Настройки Active Setup находятся в реестре, в разделе HKLM\Software\Microsoft\Active Setup\Installed Components. Для каждого компонента есть отдельный раздел с именем, состоящим из уникального идентификационного номера (GUID). В разделе есть несколько параметров, из которых нас интересуют следующие:
(по умолчанию) — название компонента, которое отображается при выполнении;
StubPath — команда, которая должна быть выполнена. Здесь можно указать команду, скрипт (cmd, vbs или powershell) или исполняемый файл;
Version — версия компонента в текстовом формате, элементы разделены запятыми (напр. 1,0,00).
Принцип работы Active Setup прост. При входе пользователя система сравнивает содержимое разделов HKLM\Software\Microsoft\Active Setup\Installed Components и HKCU\Software\Microsoft\Active Setup\Installed Components. Для каждого раздела в HKLM должна быть копия с тем же GUID в HKCU. Дальше есть три варианта развития событий:
1. Если копии нет, то выполняется команда, указанная в StubPath, после чего в HKCU создается раздел с тем же GUID и прочими параметрами.
2. Если копия есть, то сравнивается значение параметра Version. Если версия в HKCU младше, чем в HKLM, то задание отрабатывает повторно, после чего номер версии в HKCU обновляется.
3. Если же раздел с одинаковым GUID есть и в HKLM и в HKCU и номер версии у них совпадает, то значит компонент уже отработал для данного пользователя и запускать его не требуется.
Создание нового компонента
Первое, что нужно для создания собственного компонента — это GUID. Сгенерировать его можно с помощью PowerShell, командой:
[System.Guid]::NewGuid()
Затем в разделе HKLM\Software\Microsoft\Active Setup\Installed Components создаем подраздел с новым GUID и добавляем в него необходимые параметры Version и StubPath, а также при желании указываем имя компонента. Для примера я добавил в StubPath простенький cmd-скрипт, который выводит строку текста и ждет нажатия клавиши.
И при следующем входе в систему наш скрипт отрабатывает вот таким образом.
Используя GPO
Для централизованного управления Active Setup можно задействовать групповые политики. Для этого есть специальный инструмент «Предпочтения групповой политики» (Group Policies Preferences), который в числе прочего позволяет редактировать реестр. Порядок действий такой:
Сначала открываем редактор и создаем новый GPO. Открываем его на редактирование и переходим в раздел Computer Configuration\Preferences\Windows Settings\Registry. Кликаем правой клавишей и в контекстном меню переходим на New -> Registry Item.
Задаем все необходимые параметры ключа (путь, имя, тип), в качестве действия указываем создание (Create).
Таким же образом создаем все необходимые ключи. Затем полученную GPO привязываем к подразделению (OU). Теперь после применения политики задание отработает на всех компьютерах, находящихся в этом OU. А если потребуется перезапустить задачу, то достаточно отредактировать версию компонента (например с 1,0,0 на 1,0,1) и задача отработает повторно.
И в заключение одна особенность, которую нужно учитывать при использовании ActiveSetup. Дело в том, что ActiveSetup запускается перед загрузкой рабочего стола. Команды стартуют синхронно, при этом на время их выполнения вход в систему блокируется. И если созданное вами задание по какой либо причине не сможет отработать, то войти в систему не удастся. Поэтому перед применением скрипт\приложение стоит тщательно оттестировать.