RunOnce-Registrierungsschlüssel
Alle Versionen von Windows unterstützen einen Registrierungsschlüssel, RunOnce, mit dem Sie Befehle festlegen können, die das System einmalig ausführt und dann löscht. Die Erstellung von RunOnce-Registrierungsschlüsseln kann über ein Treiberpaket erfolgen.
Hinweis
Die Erstellung eines RunOnce-Registrierungsschlüssels für andere als reine Software-SWENUM-Geräte ist nicht mit der Treiberpaket-Isolierung vereinbar und kann nicht von einem Windows-Treiber aus durchgeführt werden.
In Windows 8 und Windows 8.1 werden RunOnce-Einträge für die Installation von reinen Software-SWENUM-Geräten während der Installation des Geräts verarbeitet. Andere RunOnce-Einträge werden zum RunOnce-Schlüssel hinzugefügt. Diese werden angewendet, wenn das System das nächste Mal den RunOnce-Schlüssel verarbeitet. Die Geräteinstallation zwingt das System nicht dazu, RunOnce-Einträge zu verarbeiten.
In Windows 7 und früheren Versionen führt Windows unmittelbar nach der Installation eines Geräts den unter dem Schlüssel RunOnce gespeicherten Befehl aus und entfernt dann den Schlüssel. Außerdem führt das System bei jedem Start den unter dem Schlüssel RunOnce gespeicherten Befehl aus und entfernt den Schlüssel anschließend. Wenn Sie also einen Befehl unter dem Schlüssel RunOnce ablegen, können Sie nicht ohne weiteres vorhersagen, wann er ausgeführt wird.
Unmittelbar nach der Installation eines Geräts führt Windows den unter dem Schlüssel RunOnce gespeicherten Befehl aus und entfernt dann den Schlüssel. Außerdem führt das System bei jedem Start den unter dem Schlüssel RunOnce gespeicherten Befehl aus und entfernt den Schlüssel anschließend. Wenn Sie also einen Befehl unter dem Schlüssel RunOnce ablegen, können Sie nicht ohne weiteres vorhersagen, wann er ausgeführt wird.
Für Geräte-Installationen können RunOnce-Registrierungsschlüssel mit Hilfe von add-registry-sections erstellt werden, die über INF AddReg-Direktiven angegeben werden. Jeder add-registry-section hat die folgende Syntax:
reg-root, [subkey], [value-entry-name], [flags], [value]
Die Registrierungs-Root (reg-root) und Unterschlüsselwerte für den Registrierungsschlüssel RunOnce lauten wie folgt:
HKLM, „Software\Microsoft\Windows\CurrentVersion\RunOnce“
Bei einem RunOnce-Registrierungseintrag wird die Zeichenfolge value-entry-name weggelassen. Der Typ des Eintrags, der durch den Wert Flags angegeben wird, muss entweder REG_SZ (Flags-Wert von 0x00000000) oder REG_EXPAND_SZ (Flags-Wert von 0x00010000) sein. Bei einem Eintrag des Typs REG_SZ (die Vorgabe) kann der Wert Flags weggelassen werden.
Der Parameter value in einem RunOnce-Schlüssel gibt den auszuführenden Befehl an. Dieser Parameter ist eine Zeichenfolge in Anführungszeichen, die das folgende Format hat:
Rundll32[.exe] DllName,EntryPoint[Arguments]
Standardmäßig wird ein RunOnce-Schlüssel gelöscht, nachdem der angegebene Befehl ausgeführt wurde. Sie können einem RunOnce-Schlüssel value-Parameter ein Ausrufezeichen (!) voranstellen, um das Löschen des Schlüssels bis nach dem erfolgreichen Ausführen des Befehls aufzuschieben. Ohne das Ausrufezeichen wird der Schlüssel RunOnce auch dann gelöscht, wenn der angegebene Befehl fehlschlägt, und der Befehl wird beim nächsten Systemstart nicht ausgeführt.
Außerdem werden die RunOnce-Schlüssel standardmäßig ignoriert, wenn das System im abgesicherten Modus gestartet wird. Dem Parameter value von RunOnce-Schlüsseln kann ein Sternchen (*) vorangestellt werden, damit der Befehl auch im abgesicherten Modus ausgeführt wird.
Beachten Sie die folgenden Richtlinien, wenn Sie einen value Zeichenfolge-Eintrag erstellen:
Rundll32 kann entweder mit oder ohne seine .exe Dateinamenerweiterung erscheinen.
DllName ist der vollständige Pfad einer DLL oder eines ausführbaren Images. Abgesehen von einem erforderlichen abschließenden Komma darf der Ausdruck ansonsten keine Kommas enthalten. Wenn keine Dateinamenserweiterung angegeben wird, ist die Standarderweiterung .dll.
EntryPoint ist der Name des Einstiegspunkts innerhalb der DLL, der durch DllName angegeben wird.
Arguments ist eine optionale Unterzeichenfolge, die alle Argumente enthält, die an die angegebene DLL übergeben werden müssen.
Zwischen der Zeichenfolge EntryPoint und der Unterzeichenfolge Arguments muss genau ein Leerzeichen stehen.
Das folgende Code-Beispiel zeigt den Eintrag add-registry-section, der einen Befehl und seine Argumente unter dem Schlüssel RunOnce speichert:
;; 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}"
Die folgenden Regeln gelten, wenn Sie RunOnce-Registrierungsschlüssel für die Installation von Geräten verwenden:
Diese Registrierungsschlüssel dürfen nur für Installationen von reinen Software-Geräten verwendet werden, die von SWENUM, dem Software-Geräte-Enumerator, aufgelistet werden.
RunOnce-Schlüssel dürfen nur aus Aufrufen von Rundll32.exe bestehen. Andernfalls wird WHQL das Treiber-Paket nicht digital signieren.
Der auszuführende Code darf nicht nach Benutzereingaben prompten.
Serverseitige Installationen werden in einem Systemkontext ausgeführt. Aus diesem Grund müssen Sie sicher sein, dass der auszuführende Code keine Sicherheitsschwachstellen enthält und dass die Berechtigungen der Datei verhindern, dass der Code böswillig verändert werden kann.
Ab Windows Vista führt das System die von den RunOnce-Schlüsseln angegebenen Befehle nicht aus, wenn ein/eine Benutzer*innen ohne Administratorrechte am System angemeldet ist. Dies kann zu unvollständigen oder fehlerhaften Installationen nach einem Systemneustart führen.
Bevor die Geräteinstallationsanwendung die RunOnce-Einträge erstellt, informiert sie den/die aktuellen Benutzer*innen darüber, dass sich ein/e Benutzer*in mit Administratorrechten nach einem Systemneustart anmelden muss.
Weitere Informationen finden Sie unter Entwicklung von Anwendungen, die bei der Anmeldung unter Windows Vista ausgeführt werden.