Clave del Registro RunOnce
Todas las versiones de Windows admiten una clave del registro, RunOnce, que se puede usar para especificar comandos que el sistema ejecutará una vez y, a continuación, los eliminará. La creación de claves del registro RunOnce se puede realizar desde un paquete de controladores.
Nota:
La creación de una clave de registro RunOnce para cualquier dispositivo que no sea SWENUM solo de software no cumple con el aislamiento de paquetes de controladores y no se puede hacer desde un controlador de Windows.
En Windows 8 y Windows 8.1, las entradas RunOnce para la instalación de dispositivos SWENUM de solo software se procesan durante la instalación del dispositivo. Otras entradas RunOnce se agregan a la clave RunOnce. Se aplican la próxima vez que el sistema procese la clave RunOnce. La instalación del dispositivo no obliga al sistema a procesar entradas RunOnce.
En Windows 7 y versiones anteriores, inmediatamente después de instalar un dispositivo, Windows ejecuta el comando almacenado en la clave RunOnce y, a continuación, quita la clave. Además, cada vez que se inicia el sistema, ejecuta el comando almacenado en la clave RunOnce y, a continuación, quita la clave. Por lo tanto, si coloca un comando en la clave RunOnce, no podrá predecir fácilmente cuándo se va a ejecutar.
Inmediatamente después de instalar un dispositivo, Windows ejecuta el comando almacenado en la clave RunOnce y, a continuación, quita la clave. Además, cada vez que se inicia el sistema, ejecuta el comando almacenado en la clave RunOnce y, a continuación, quita la clave. Por lo tanto, si coloca un comando en la clave RunOnce, no podrá predecir fácilmente cuándo se va a ejecutar.
En el caso de las instalaciones de dispositivos, las claves del registro RunOnce se pueden crear mediante add-registry-sections, que se especifican mediante directivas AddReg de INF. Cada add-registry-section tiene la sintaxis siguiente:
reg-root, [subkey], [value-entry-name], [flags], [value]
La raíz del registro (reg-root) y los valores de subclave de la clave del registro RunOnce son los siguientes:
HKLM, "Software\Microsoft\Windows\CurrentVersion\RunOnce"
La cadena value-entry-name se omite de una entrada del registro RunOnce. El tipo de la entrada, que se indica mediante el valor de Flags, debe ser REG_SZ (valor de Flags 0x00000000) o REG_EXPAND_SZ (valor de Flags 0x00010000). Para una entrada de tipo REG_SZ (valor predeterminado), se puede omitir el valor de Flags.
El parámetro value de una clave RunOnce especifica el comando que se va a ejecutar. Este parámetro es una cadena entre comillas que tiene el siguiente formato:
Rundll32[.exe] DllName,EntryPoint[Arguments]
De forma predeterminada, se elimina una clave RunOnce después de ejecutar el comando especificado. Puede anteponer un signo de exclamación (!) a un parámetro de value de la clave RunOnce para aplazar la eliminación de la clave hasta después de que el comando se ejecute correctamente. Sin el prefijo de signo de exclamación, si se produce un error en el comando especificado, se eliminará la clave RunOnce y el comando no se ejecutará la próxima vez que se inicie el sistema.
Además, de forma predeterminada, las claves RunOnce se omiten cuando el sistema se inicia en modo seguro. Al parámetro value de las claves RunOnce se le puede añadir como prefijo un asterisco (*) para forzar que el comando se ejecute incluso en modo seguro.
Tenga en cuenta las instrucciones siguientes al crear una entrada de cadena value:
Rundll32 puede aparecer con o sin su extensión de nombre de archivo .exe.
DllName es la ruta de acceso completa de una imagen DLL o ejecutable. Salvo una coma final obligatoria, la expresión no debe contener comas. Si no se proporciona ninguna extensión de nombre de archivo, la extensión predeterminada es .dll.
EntryPoint es el nombre del punto de entrada dentro del archivo DLL indicado por DllName.
Arguments es una subcadena opcional que contiene los argumentos que se deben pasar al archivo DLL especificado.
Exactamente un espacio debe separar la cadena EntryPoint de la subcadena Arguments.
En el ejemplo de código siguiente se muestra la entrada add-registry-section que almacena un comando y sus argumentos en la clave 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}"
Las reglas siguientes se aplican al usar las claves del registro RunOnce para instalaciones de dispositivos:
Estas claves del registro solo se deben usar para instalaciones de dispositivos solo de software enumerados por SWENUM, el enumerador de dispositivos de software.
Las claves RunOnce solo deben constar de llamadas a Rundll32.exe. De lo contrario, WHQL no firmará digitalmente el paquete de controladores.
El código que se va a ejecutar no debe solicitar la entrada del usuario.
Las instalaciones del lado de servidor se ejecutan en un contexto del sistema. Por este motivo, debe estar seguro de que el código que se va a ejecutar no contiene vulnerabilidades de seguridad y que los permisos de archivo impiden que el código se modifique de forma malintencionada.
A partir de Windows Vista, el sistema no ejecutará los comandos especificados por las claves RunOnce si un usuario sin privilegios de administrador ha iniciado sesión en el sistema. Esto podría provocar instalaciones incompletas o dañadas después de un reinicio del sistema.
Antes de que la aplicación de instalación de dispositivos cree las entradas RunOnce, informa al usuario actual de que un usuario que tiene privilegios de administrador debe iniciar sesión después de reiniciar el sistema.
Para obtener más información, consulte Desarrollo de aplicaciones que se ejecutan al iniciar sesión en Windows Vista.