RunOnce Registry Key
Toutes les versions de Windows prennent en charge une clé de registre, RunOnce, qui peut être utilisée pour spécifier des commandes que le système exécutera une fois, puis supprimera. La création de clés de registre RunOnce peut être effectuée à partir d’un package de pilote.
Remarque
La création d’une clé de registre RunOnce pour autre chose que des périphériques SWENUM purement logiciels n’est pas conforme à l’isolation des packages de pilotes et ne peut pas être effectuée à partir d’un Pilote Windows.
Dans Windows 8 et Windows 8.1, les entrées RunOnce pour l’installation de périphériques SWENUM purement logiciels sont traitées lors de l’installation du périphérique. D’autres entrées RunOnce sont ajoutées à la clé RunOnce. Celles-ci sont appliquées la prochaine fois que le système traite la clé RunOnce. L’installation du périphérique ne force pas le système à traiter les entrées RunOnce.
Dans Windows 7 et les versions précédentes, immédiatement après l’installation d’un périphérique, Windows exécute la commande stockée sous la clé RunOnce puis supprime la clé. De plus, chaque fois que le système démarre, il exécute la commande stockée sous la clé RunOnce puis supprime la clé. Par conséquent, si vous placez une commande sous la clé RunOnce, vous ne pouvez pas facilement prédire quand elle sera exécutée.
Immédiatement après l’installation d’un périphérique, Windows exécute la commande stockée sous la clé RunOnce puis supprime la clé. De plus, chaque fois que le système démarre, il exécute la commande stockée sous la clé RunOnce puis supprime la clé. Par conséquent, si vous placez une commande sous la clé RunOnce, vous ne pouvez pas facilement prédire quand elle sera exécutée.
Pour les installations de périphériques, les clés de registre RunOnce peuvent être créées en utilisant des add-registry-sections, spécifiées via des directives AddReg INF. Chaque add-registry-section a la syntaxe suivante :
reg-root, [subkey], [value-entry-name], [flags], [value]
La racine du registre (reg-root) et les sous-clés pour la clé de registre RunOnce sont les suivantes :
HKLM, « Software\Microsoft\Windows\CurrentVersion\RunOnce »
La chaîne value-entry-name est omise dans une entrée de registre RunOnce. Le type de l’entrée, qui est indiqué par la valeur Flags, doit être soit REG_SZ (valeur de Flags de 0x00000000) soit REG_EXPAND_SZ (valeur de Flags de 0x00010000). Pour une entrée de type REG_SZ (la valeur par défaut), la valeur Flags peut être omise.
Le paramètre valeur dans une clé RunOnce spécifie la commande à exécuter. Ce paramètre est une chaîne entre guillemets ayant le format suivant :
Rundll32[.exe] DllName,EntryPoint[Arguments]
Par défaut, une clé RunOnce est supprimée après l’exécution de la commande spécifiée. Vous pouvez préfixer un paramètre valeur de clé RunOnce par un point d’exclamation (!) pour différer la suppression de la clé jusqu’à ce que la commande soit exécutée avec succès. Sans le préfixe point d’exclamation, si la commande spécifiée échoue, la clé RunOnce sera tout de même supprimée et la commande ne sera pas exécutée au prochain démarrage du système.
De plus, par défaut, les clés RunOnce sont ignorées lorsque le système démarre en mode sans échec. Le paramètre valeur des clés RunOnce peut être préfixé d’un astérisque (*) pour forcer l’exécution de la commande même en mode sans échec.
Tenez compte des directives suivantes lors de la création d’une entrée de chaîne valeur :
Rundll32 peut apparaître avec ou sans son extension de nom de fichier .exe.
DllName est le chemin complet d’une image DLL ou exécutable. À l’exception d’une virgule de terminaison requise, l’expression ne doit pas contenir d’autres virgules. Si aucune extension de nom de fichier n’est fournie, l’extension par défaut est .dll.
EntryPoint est le nom du point d’entrée dans la DLL indiquée par DllName.
Arguments est une sous-chaîne optionnelle qui contient les arguments à transmettre à la DLL spécifiée.
Un seul espace doit séparer la chaîne EntryPoint de la sous-chaîne Arguments.
L’exemple de code suivant montre l’entrée add-registry-section qui stocke une commande et ses arguments sous la clé 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}"
Les règles suivantes s’appliquent lorsque vous utilisez les clés de registre RunOnce pour les installations de périphériques :
Ces clés de registre doivent être utilisées uniquement pour l’installation de périphériques purement logiciels qui sont énumérés par SWENUM, l’énumérateur de périphériques logiciels.
Les clés RunOnce doivent se composer uniquement d’appels à Rundll32.exe. Sinon, WHQL ne signera pas numériquement le package de pilote.
Le code à exécuter ne doit pas demander d’entrée de la part de l’utilisateur.
Les installations côté serveur s’exécutent dans un contexte système. Pour cette raison, vous devez vous assurer que le code à exécuter ne contient aucune vulnérabilité de sécurité et que les permissions des fichiers empêchent toute modification malveillante du code.
À partir de Windows Vista, le système n’exécutera pas les commandes spécifiées par les clés RunOnce si un utilisateur sans privilèges d’administrateur est connecté au système. Cela pourrait entraîner des installations incomplètes ou corrompues après un redémarrage du système.
Avant que l’application d’installation de périphérique ne crée les entrées RunOnce, elle informe l’utilisateur actuel qu’un utilisateur disposant de privilèges d’administrateur doit se connecter après un redémarrage du système.
Pour plus d’informations, veuillez consulter la section Développement d’applications qui s’exécutent lors de la connexion sous Windows Vista.