Раздел реестра RunOnce

Все версии Windows поддерживают раздел реестра RunOnce, который можно использовать для указания команд, которые система будет выполнять один раз, а затем удалять. Создание разделов реестра RunOnce можно выполнить из пакета драйверов.

Примечание

Создание раздела реестра RunOnce для других устройств, кроме устройств SWENUM с программным обеспечением, не соответствует изоляции пакета драйверов и не может быть выполнено из драйвера Windows.

В Windows 8 и Windows 8.1 записи RunOnce для установки устройств SWENUM, доступных только для программного обеспечения, обрабатываются во время установки устройства. Другие записи RunOnce добавляются в ключ RunOnce . Они применяются при следующей обработке системой ключа RunOnce . Установка устройства не заставляет систему обрабатывать записи RunOnce .

В Windows 7 и предыдущих версиях сразу после установки устройства Windows выполняет команду, хранящуюся в ключе RunOnce , а затем удаляет ключ. Кроме того, при каждом запуске система выполняет команду, хранящуюся в ключе RunOnce , а затем удаляет ключ. Таким образом, если вы поместите команду в ключ RunOnce , вы не сможете легко предсказать, когда она будет выполнена.

Сразу после установки устройства Windows выполняет команду, хранящуюся в разделе RunOnce , а затем удаляет ключ. Кроме того, при каждом запуске система выполняет команду, хранящуюся в ключе RunOnce , а затем удаляет ключ. Таким образом, если вы поместите команду в ключ RunOnce , вы не сможете легко предсказать, когда она будет выполнена.

Для установки устройств разделы реестра RunOnce можно создать с помощью разделов add-registry-sections, которые указываются с помощью директив AddReg INF. Каждый раздел add-registry-section имеет следующий синтаксис:

reg-root, [subkey], [value-entry-name], [flags], [value]

Корневая папка реестра (reg-root) и подраздел раздела реестра RunOnce приведены ниже.

HKLM, "Software\Microsoft\Windows\CurrentVersion\RunOnce"

Строка value-entry-name не указана в записи реестра RunOnce . Тип записи, обозначаемый значением Flags , должен быть REG_SZ (значение флагов 0x00000000) или REG_EXPAND_SZ (значение флагов 0x00010000). Для записи типа REG_SZ (по умолчанию) значение Флаги можно опустить.

Параметр value в ключе RunOnce указывает выполняемую команду. Этот параметр представляет собой строку в кавычках в следующем формате:

Rundll32[.exe] DllName,EntryPoint[Arguments]

По умолчанию ключ RunOnce удаляется после выполнения указанной команды. Для параметра значения ключа RunOnce можно добавить префикс с восклицательным знаком (!), чтобы отложить удаление ключа до успешного выполнения команды. Без префикса восклицательного знака в случае сбоя указанной команды ключ RunOnce по-прежнему будет удален и команда не будет выполнена при следующем запуске системы.

Кроме того, по умолчанию ключи RunOnce игнорируются при запуске системы в безопасном режиме. Параметр value ключей RunOnce может иметь префикс звездочки (*), чтобы принудительно выполнять команду даже в безопасном режиме.

При создании записи строки значения учитывайте следующие рекомендации.

  • Rundll32 может отображаться как с расширением имени файла.exe , так и без нее.

  • DllName — это полный путь к dll-файлу или исполняемому образу. За исключением обязательной завершающей запятой, выражение не должно содержать запятые. Если расширение имени файла не указано, по умолчанию используется расширение.dll.

  • EntryPoint — это имя точки входа в библиотеке DLL, указанной dllName.

  • Arguments — это необязательная подстрока, содержащая все аргументы, которые необходимо передать в указанную библиотеку DLL.

  • Ровно один пробел должен отделять строку EntryPoint от подстроки Arguments .

В следующем примере кода показана запись add-registry-section , в которой команда и ее аргументы хранятся в разделе RunOnce :

;; WDMAud swenum install

HKLM,%RunOnce%,"WDM_WDMAUD",,\
"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_WDMAUD.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_WDMAUD%,%17%\WDMAUDIO.inf,WDM_WDMAUD.Interface.Install"

[Strings]
RunOnce = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
WDM_WDMAUD.DeviceId = "{CD171DE3-69E5-11D2-B56D-0000F8754380}"
KSNAME_Filter = "{9B365890-165F-11D0-A195-0020AFD156E4}"
KSCATEGORY_WDMAUD = "{3E227E76-690D-11D2-8161-0000F8775BF1}"

При использовании разделов реестра RunOnce для установки устройств применяются следующие правила:

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

  • Ключи RunOnce должны состоять только из вызовов Rundll32.exe. В противном случае WHQL не будет подписывать пакет драйвера цифровой подписью.

  • Выполняемый код не должен запрашивать ввод данных пользователем.

  • Установка на стороне сервера выполняется в системном контексте. По этой причине необходимо убедиться, что выполняемый код не содержит уязвимостей системы безопасности и что разрешения файлов препятствуют злонамеренному изменению кода.

  • Начиная с Windows Vista, система не будет выполнять команды, заданные ключами RunOnce , если пользователь без прав администратора вошел в систему. Это может привести к неполной или поврежденной установке после перезапуска системы.

    Прежде чем приложение установки устройства создаст записи RunOnce , оно информирует текущего пользователя о том, что пользователь с правами администратора должен войти в систему после перезапуска системы.

    Дополнительные сведения см. в статье Разработка приложений, которые выполняются при входе в Windows Vista.