RunOnce Registry キー
すべてのバージョンの Windows では、 レジストリ キー RunOnce がサポートされています。このキーを使用して、システムが 1 回実行してから削除するコマンドを指定できます。 RunOnce レジストリ キーの作成は、ドライバー パッケージから行うことができます。
Note
ソフトウェアのみの SWENUM デバイス以外の場合の RunOnce レジストリ キーの作成は、ドライバー パッケージの分離に準拠していないため、Windows ドライバーからは実行できません。
Windows 8 および Windows 8.1 では、 ソフトウェアのみの SWENUM デバイスのインストール用の RunOnce エントリは、デバイスのインストール中に処理されます。 その他の RunOnce エントリが RunOnce キーに追加されます。 これらは、システムが次に RunOnce キーを処理する際に適用されます。 デバイスのインストールでは、RunOnce エントリの処理はシステムに強制されません。
Windows 7 以前のバージョンでは、デバイスがインストールされた直後に、Windows は RunOnce キーの下に格納されているコマンドを実行し、キーを削除します。 さらに、システムが起動するたびに、RunOnce キーの下に格納されているコマンドが実行され、キーが削除されます。 そのため、RunOnce キーの下にコマンドを配置すると、いつ実行されるかを簡単に予測することはできません。
デバイスがインストールされた直後に、Windows は RunOnce キーの下に格納されているコマンドを実行し、キーを削除します。 さらに、システムが起動するたびに、RunOnce キーの下に格納されているコマンドが実行され、キーが削除されます。 そのため、RunOnce キーの下にコマンドを配置すると、いつ実行されるかを簡単に予測することはできません。
デバイスのインストールの場合、RunOnce レジストリ キーは、INF AddReg ディレクティブで指定される add-registry-sections を使用して作成できます。 各 add-registry-section には、次の構文があります。
reg-root, [subkey], [value-entry-name], [flags], [value]
RunOnce レジストリ キーのレジストリ ルート (reg-root) とサブキーの値は次のとおりです。
HKLM, "Software\Microsoft\Windows\CurrentVersion\RunOnce"
value-entry-name の文字列は、RunOnce レジストリ エントリから省略されます。 Flags 値で示されるエントリの型は、REG_SZ (0x00000000 の Flags 値) または REG_EXPAND_SZ (0x00010000 の Flags 値) である必要があります。 REG_SZ 型のエントリ (既定値) の場合、Flags 値を省略できます。
RunOnce キーの value パラメーターは、実行するコマンドを指定します。 このパラメーターは、次の形式の引用符で囲まれた文字列です。
Rundll32[.exe] DllName,EntryPoint[Arguments]
既定では、 RunOnce キーは、指定したコマンドの実行後に削除されます。 RunOnce キー値パラメーターの前に感嘆符 (!) を付けて、コマンドが正常に実行されるまでキーの削除を延期できます。 感嘆符プレフィックスがない場合、指定したコマンドが失敗しても、 RunOnce キーは削除され、次回システムが起動してもコマンドは実行されません。
また、システムが セーフ モードで起動されると、既定では RunOnce キーは無視されます。 RunOnce キーの値パラメーターの前にアスタリスク (*) を付けて、セーフ モードでもコマンドを強制的に実行できます。
値文字列エントリを作成するときは、次のガイドラインを考慮してください。
Rundll32 は、.exeファイル名拡張子の有無にかかわらず表示できます。
DllName は、DLL または実行可能イメージの完全なパスです。 必須の終端コンマを除き、式にコンマを含めてはなりません。 ファイル名拡張子が指定されていない場合、既定の拡張子は .dll です。
EntryPoint は、DllName で 示される DLL 内のエントリ ポイントの名前です。
引数は、指定した DLL に渡す必要がある引数を含む省略可能な部分文字列です。
1 つのスペースで、EntryPoint 文字列と 引数文字列を分離する必要があります。
次のコード例は、RunOnce キーの 下にコマンドとその引数を格納する add-registry-section エントリを 示 しています。
;; 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 でのログオン時に実行されるアプリケーションの開発」を参照してください。