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 でのログオン時に実行されるアプリケーションの開発」を参照してください。