所有版本的 Windows 都支持 RunOnce 注册表项,该项可用于指定系统将执行一次然后删除的命令。 可通过驱动程序包来创建 RunOnce 注册表项。
注意
为仅软件 SWENUM 设备以外的其他设备创建 RunOnce 注册表项目不符合驱动程序包隔离的规定,并且不能从 Windows 驱动程序中创建。
在 Windows 8 和 Windows 8.1 中,设备安装过程中会处理用于安装仅软件 SWENUM 设备的 RunOnce 条目。 其他 RunOnce 条目将添加到 RunOnce 项中。 下次系统处理 RunOnce 项时,将应用这些项。 设备安装不会强制系统处理 RunOnce 条目。
在 Windows 7 和以前的版本中,安装设备后,Windows 会立即执行存储在 RunOnce 项下的命令,然后再删除该项。 此外,每次启动系统时,系统都会执行 RunOnce 项下存储的命令,然后再删除该项。 因此,如果将命令放在 RunOnce 项下,就无法轻松预测该命令的执行时间。
安装设备后,Windows 会立即执行存储在 RunOnce 项下的命令,然后再删除该项。 此外,每次启动系统时,系统都会执行 RunOnce 项下存储的命令,然后再删除该项。 因此,如果将命令放在 RunOnce 项下,就无法轻松预测该命令的执行时间。
对于设备安装,可使用 add-registry-sections 来创建 RunOnce 注册表项,这些项可通过 INF AddReg directives 来指定。 每个 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(Flags 值为 0x00000000)或 REG_EXPAND_SZ(Flags 值为 0x00010000)。 对于 REG_SZ 类型(默认)的条目,Flags 值可以被省略。
RunOnce 项中的 value 参数指定要执行的命令。 此参数是一个带引号的字符串,格式如下:
Rundll32[.exe] DllName,EntryPoint[Arguments]
默认情况下,RunOnce 项会在执行指定命令后被删除。 可以在 RunOnce 项 value 参数前加上感叹号 (!),以便在命令成功运行后再删除该项。 如果没有感叹号前缀,如果指定的命令失败,RunOnce 项仍会被删除,并且在下次启动系统时不会执行该命令。
此外,默认情况下,在安全模式下启动系统时,RunOnce 项将被忽略。 RunOnce 项的 value 参数可以用星号 (*) 作为前缀,以强制在安全模式下执行命令。
创建 value 字符串条目时,请考虑以下准则:
Rundll32 既可以使用 .exe 文件扩展名,也可以不使用。
DllName 是 DLL 或可执行映像的完整路径。 除了必要的结束逗号外,表达式不得包含任何逗号。 如果没有提供文件扩展名,默认扩展名为 .dll。
EntryPoint 是 DllName 所指示的 DLL 中的入口点名称。
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 上登录时运行的应用程序。