共用方式為


RunOnce 登錄機碼

所有版本的 Windows 都支援登錄機碼 RunOnce,其可用來指定系統將執行一次,然後刪除的命令。 您可以從驅動程式套件建立 RunOnce 登錄機碼。

注意

針對非軟體 SWENUM 裝置以外的任何裝置建立 RunOnce 登錄機碼不符合驅動程式套件隔離的規範,且無法從 Windows 驅動程式完成。

在 Windows 8 和Windows 8.1中, 安裝僅限軟體 SWENUM 裝置的 RunOnce 專案會在裝置安裝期間進行處理。 其他 RunOnce 專案會新增至 RunOnce 金鑰。 這些會在系統下次處理 RunOnce 金鑰時套用。 裝置安裝不會強制系統處理 RunOnce 專案。

在 Windows 7 和舊版中,在安裝裝置之後,Windows 會執行儲存在 RunOnce 金鑰下的命令,然後移除密鑰。 此外,每次系統啟動時,它會執行儲存在 RunOnce 機碼底下的命令,然後移除金鑰。 因此,如果您將命令放在 RunOnce 機碼底下,則無法輕易預測其執行時機。

安裝裝置之後,Windows 會立即執行儲存在 RunOnce 金鑰下的命令,然後移除金鑰。 此外,每次系統啟動時,它會執行儲存在 RunOnce 機碼底下的命令,然後移除金鑰。 因此,如果您將命令放在 RunOnce 機碼底下,則無法輕易預測其執行時機。

針對裝置安裝,您可以使用 add-registry-sections 來建立 RunOnce 登錄機碼,這些區段是透過 INF AddReg 指示詞所指定。 每個 add-registry-section 都有下列語法:

reg-root, [subkey], [value-entry-name], [flags], [value]

RunOnce 登錄機碼的登錄根目錄 (reg-root) 和子機碼值如下所示:

HKLM,“Software\Microsoft\Windows\CurrentVersion\RunOnce”

RunOnce 登錄專案省略 value-entry-name 字串。 Flags 值所指示的專案類型必須是 REG_SZ (flags 值 0x00000000) 或 REG_EXPAND_SZflags 值 0x00010000)。 針對類型 為 REG_SZ 的專案(預設值), 可以省略 Flags 值。

RunOnce 索引鍵中的 value 參數會指定要執行的命令。 此參數是具有下列格式的引號字串:

Rundll32[.exe] DllName,EntryPoint[Arguments]

根據預設, 執行指定的命令之後,會刪除 RunOnce 金鑰。 您可以在 RunOnce 索引鍵 參數前面加上驚嘆號 (!), 以延遲刪除金鑰,直到命令成功執行為止。 如果沒有驚嘆號前置詞,如果指定的命令失敗, RunOnce 機碼仍會被刪除,而且下次啟動系統時將不會執行命令。

此外,根據預設,當系統以安全模式啟動時, 會忽略 RunOnce 金鑰。 RunOnce 索引鍵的值參數可以加上星號, 以強制即使在安全模式中執行命令。

當您建立 字串專案時,請考慮下列指導方針:

  • Rundll32 可以搭配或不含其 .exe 擴展名。

  • DllName 是 DLL 或可執行映像的完整路徑。 除了必要的終止逗號以外,表達式不得包含任何逗號。 如果未提供擴展名,默認擴展名會 .dll

  • EntryPoint 是 DllName指示之 DLL 內的進入點名稱。

  • 自變數是選擇性的子字串,其中包含任何必須傳遞至指定 DLL 的自變數。

  • 只有一個空格必須分隔 EntryPoint 字串與 Arguments 子字串。

下列程式代碼範例顯示 add-registry-section 專案,其會將命令及其自變數儲存在 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}"

當您針對裝置安裝使用 RunOnce 登錄機碼時,適用下列規則:

  • 這些登錄機碼只能用於安裝 SWENUM 所列舉的軟體專用裝置,也就是軟體裝置列舉值。

  • RunOnce 金鑰只能包含對 Rundll32.exe呼叫。 否則,WHQL 將不會以數位方式簽署 驅動程式套件

  • 要執行的程式代碼不得提示用戶輸入。

  • 伺服器端安裝會在系統內容中執行。 基於這個理由,您必須確定要執行的程式代碼不包含任何安全性弱點,而且該檔案許可權會防止程序代碼遭到惡意修改。

  • 從 Windows Vista 開始,如果沒有系統管理員許可權的使用者登入系統,系統將不會執行 RunOnce 金鑰所指定的命令。 這可能會導致系統重新啟動之後未完成或損毀的安裝。

    裝置安裝應用程式 建立 RunOnce 專案之前,它會通知目前使用者具有系統管理員許可權的使用者必須在系統重新啟動後登入。

    如需詳細資訊,請參閱 開發在 Windows Vista 登入時執行的應用程式。