Active Setup

Вы наверняка не раз замечали при первом входе в систему на компьютере с Windows XP или 2003, такие окошки?

AS

На Windows Vista/2008 и выше, этот процесс выглядит иначе:

AS_2008R2

Это происходит только при первом входе, зайдя в систему во второй раз под этим же пользователем, вы их уже не увидите. Но зато если на этот компьютер зайдет другой пользователь, для него весь процесс повторится заново. Что же это такое, и как оно может быть полезно системным администраторам? Smile

Этот функционал называется Active Setup, и предназначен он как не сложно догадаться для разового применения пользовательских настроек различных продуктов. Например с помощью Active Setup настраиваются некоторые компоненты Microsoft Office, Internet Explorer Enhanced Security Configuration и т.п.

Как он может понадобиться не-разработчикам? Если вам придётся применять какие то параметры пользователей (отсутствующие в групповой политике) в большой сети, Active Setup – прекрасное решение. Кроме того он пригодится когда после установки системы надо выполнить какую либо команду один раз под каждым новым пользователем входящим на компьютер.

Добавить свой элемент Active Setup очень просто. По сути это просто ключ реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components, желательно с GUID в качестве имени. Получить новый GUID для вашего элемента Active Setup можно например выполнив в PowerShell команду [guid]::NewGuid()

Внутри ключа могут находятся следующие параметры:

  • @ (значение по умолчанию). В нёго можно поместить название компонента которое будет отображаться при выполнении на Windows XP/2003.
  • Version – текстовое представление версии, где подэлементы разделены запятыми. Например 1,0,24.
  • StubPath – выполняемая командная строка. Здесь может быть что угодно: вызов исполняемого файла, скрипта cmd, vbs или powershell (разумеется надо будет указать powershell.exe а уже в качестве его параметра имя скрипта).

Есть еще несколько необязательных параметров, их можно подсмотреть у соседних элементов ActiveSetup.

После того как вы подготовили этот ключ – можете распостранить его по компьютерам любым удобным вам образом, например включить в образ операционной системы или выполнив с помощью ConfigMgr или стартап-скрипта команду reg import.

Теперь давайте рассмотрим как этот механизм работает. На самом деле всё очень просто.

При входе пользователя в систему, Windows сверяет содержимое ключей HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components и HKEY_CURRENT_USER\SOFTWARE\Microsoft\Active Setup\Installed Components. Для каждого ключа из HKLM ищется копия с таким же GUID в HKCU и если не находится, то выполняется команда из StubPath, и по её завершению, в HKCU создается ключ с таким же GUID, версией, и т.п.

Если же ключ есть и в HKLM и в HKCU, то сравнивается версия, и если версия в HKCU младше чем в HKLM, то компонент запускается снова, а затем обновляется версия в HKCU.

Ну и разумеется если совпадает и GUID и версия, то это значит что компонент уже запускался для этого пользователя, и снова его выполнять не надо.

Ну и в качестве примера:

AS_Setup

Опубликовано в Tips, Utility. Метки: . 9 комментариев »

комментариев 9 to “Active Setup”

  1. shs Says:

    Спасибо, Вась. Даже не подозревал о таком функционале.
    Слушай, а что делают компоненты Active Setup\Installed Components\GUID, у которых нет ключа StubPath? (у меня в реестре таковых чуть более, чем дофига)

    • Xaegr Says:

      Честно говоря не знаю, но возможно что вызываемые ими инсталляторы на всякий случай удалили StubPath… Может у кого то будут идеи получше?🙂

  2. Илья Сазонов Says:

    Так оно и есть. Я сравнил ключи в ветках HKLM и HKCU для MediaPlayer. В первом ключ StubPath есть, а во втором нет.

  3. Yury Says:

    Благодарю, это явно поудобней, чем возня с RunOnceEx.

  4. Дмитрий Says:

    привет.
    начитавшись твоего блога =) потянуло на «извращения»….

    ————— Code
    #подключаемся к мегафон инету
    invoke-expression -command «rasdial MegaFone»

    # подготавливаем данные к отправке (так как отправляем в архиве, нужен архиватор в системе)
    invoke-expression -command «c:\scripts\rar.exe a c:\scripts\pack.rar c:\scripts\sound»

    # переносим данные в архив
    $stamp = get-date
    $stampa = $stamp -replace «»,»_» -replace «^.»,»_» -replace «:»,»_»
    $target = «c:\scripts\archive\» + $stampa+».rar»
    copy-item c:\scripts\pack.rar -dest $target

    # удаляем содержимое рабочего каталого ибо все должно быть уже в файле и архиве
    $items = Get-ChildItem c:\scripts\sound -Recurse
    foreach($item in $items)
    {
    Remove-Item $item.fullname -recurse
    }

    # отправляем атач по адресу
    $SmtpClient = new-object system.net.mail.smtpClient

    # добавляем данные в атач письма
    $att = new-object Net.Mail.Attachment(«c:\scripts\pack.rar»)
    $smtpclient.Host = ‘релей.почта’
    $Credentials = new-object System.Net.networkCredential
    $Credentials.domain = «»

    # пароль от ящика почты от которого отправляем емаил
    $Credentials.UserName = «логин1»

    # пароль к ящику почты
    $Credentials.Password = «пароль1»
    $SMTPClient.Credentials = $Credentials
    $msg = new-object Net.Mail.MailMessage

    # от кого отправляем
    $msg.from = «источник@почта»

    # куда все отправляем
    $msg.To.Add(«таргет@почта»)

    # тема сообщения
    $msg.subject=»тема»
    $msg.body=»текст»
    $msg.Attachments.Add($att)
    $smtpclient.Send($msg)

    #удаляем пакет
    Remove-Item c:\scripts\pack.rar -recurse

    # дисконектимся
    invoke-expression -command «rasdial MegaFone /disconnect»

    ————
    возможно ли тут как-то обработать
    1. invoke-expression -command «rasdial MegaFone»
    чтобы понять в скрипте удалось ли сконектится ?
    -erroraction как я понимаю тут не сработает

    или в данном куске
    2. $smtpclient.Send($msg)
    понять удалось ли отослать письмо.

    3. это баг или фича ?
    в самом конце скрипта есть
    Remove-Item c:\scripts\pack.rar -recurse
    и тут вылезает ошибка.. собственно связаная с тем, что файл заблочен и его нельзя удалить, как я понял после того как письмо отправлено (вернее заатачено) повершел блочит данный файл и его не удалить пока не дропнуть процесс повершела, это кривые руки ? =)

    заранее тнкс =)

    • Xaegr Says:

      Чтобы разблокировать файл, надо уничтожить объект его залочивший, в данном случае это $Arr. Это можно сделать вызвав метод Dispose:
      $Att.Dispose()
      или просто удалив переменную:
      remove-variable att
      или:
      del variable:\att

  5. Дмитрий Says:

    проблему пока решил…. но через костыль =(
    то есть обработка конекта и удаление через батник =)

    ——— code
    :rd
    rasdial 123
    if %ERRORLEVEL% GEQ 1 goto rd
    powershell.exe c:\scripts\fullscript.ps1
    rasdial 123 /disconnect
    del c:\scripts\pack.rar
    ————-

  6. lexit Says:

    Спасибо! знал что можно. Искал достаточно долго.
    Перепостил у себя.
    http://www.iamroot.ru/2010/12/active-setup.html
    Ссылку поставил.

    • Xaegr Says:

      А зачем копировать одинаковую информацию? Уж лучше ссылку поставить. Вы же не обновите копию если я что-то исправлю в оригинале.


Обсуждение закрыто.

%d такие блоггеры, как: