共用方式為


Registry Virtualization

登錄虛擬化 是一種應用程式相容性技術,可讓具有全域影響的登錄寫入作業重新導向至每個使用者位置。 此重新導向對讀取或寫入登錄的應用程式而言是透明的。 從 Windows Vista 開始支援。

這種形式的虛擬化是暫時的應用程式相容性技術;Microsoft想要從未來的 Windows作系統版本中移除它,因為更多應用程式與 Windows Vista 和更新版本的 Windows 相容。 因此,重要的是您的應用程式不會變成相依於系統中登錄虛擬化的行為。

虛擬化僅供提供現有應用程式的相容性。 針對 Windows Vista 和更新版本 Windows 所設計的應用程式不應該寫入敏感系統區域,也不應該依賴虛擬化來補救任何問題。 更新現有程式代碼以在 Windows Vista 和更新版本的 Windows 上執行時,開發人員應確保應用程式只會將資料儲存在每一使用者位置或計算機位置內,%alluserprofile% 正確使用存取控制清單 (ACL)。

如需建置 UAC 相容應用程式的詳細資訊,請參閱 UAC 開發人員指南

虛擬化概觀

在 Windows Vista 之前,應用程式通常是由系統管理員執行。 因此,應用程式可以自由存取系統檔案和登錄機碼。 如果這些應用程式是由標準使用者執行,它們會因為訪問許可權不足而失敗。 Windows Vista 和更新版本的 Windows 會自動重新導向這些作業,以改善這些應用程式的應用程式相容性。 例如,全域存放區 (HKEY_LOCAL_MACHINE\Software) 的登錄作業會重新導向至使用者配置檔內的每個使用者位置,稱為 虛擬市集HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software)。

登入虛擬化可廣泛分類為下列類型:

Open Registry Virtualization

如果呼叫端沒有密鑰的寫入許可權,而且嘗試開啟金鑰,則會以該呼叫端允許的最大存取權開啟密鑰。

如果已為金鑰設定REG_KEY_DONT_SILENT_FAIL旗標,則作業會失敗,且密鑰未開啟。 如需詳細資訊,請參閱本主題稍後的。

Write Registry Virtualization

如果呼叫端沒有密鑰的寫入許可權,而且嘗試將值寫入至它或建立子機碼,則會將值寫入虛擬存放區。

例如,如果有限的用戶嘗試將值寫入下列索引鍵:HKEY_LOCAL_MACHINE\Software\AppKey1,虛擬化會將寫入作業重新導向至 HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\AppKey1

讀取登錄虛擬化

如果呼叫端從虛擬化的機碼讀取,登錄就會將虛擬化值(從虛擬存放區)和非虛擬值(從全域存放區)合併檢視呈現給呼叫端。

例如,假設 HKEY_LOCAL_MACHINE\Software\AppKey1 包含兩個值 V1 和 V2,而有限的使用者會將值 V3 寫入密鑰。 當使用者嘗試從此索引鍵讀取值時,合併的檢視會包含來自全域存放區的值 V1 和 V2,以及虛擬存放區中的值 V3。

請注意,當存在時,虛擬值優先於全域值。 在上述範例中,即使全域存放區在此機碼下有值 V3,V3 值仍會從虛擬存放區傳回給呼叫端。 如果要從虛擬存放區刪除 V3,則會從全域存放區傳回 V3。 換句話說,如果要從 HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\AppKey1 刪除 V3,但 HKEY_LOCAL_MACHINE\Software\AppKey1 具有 V3 值,則會從全域存放區傳回該值。

登錄虛擬化範圍

僅針對下列項目啟用登錄虛擬化:

  • 32 位互動式進程。
  • HKEY_LOCAL_MACHINE\Software中的索引鍵。
  • 系統管理員可以寫入的金鑰。 (如果系統管理員無法寫入密鑰,則即使應用程式是由系統管理員執行,在舊版 Windows 上也會失敗。

下列項目已停用登錄虛擬化:

  • 64 位進程。

  • 不是互動式的進程,例如服務。

    請注意,將登錄當做服務之間的進程間通訊(IPC)機制,或未啟用虛擬化的任何其他進程,如果密鑰虛擬化,應用程式將無法正常運作。 例如,如果防毒服務根據應用程式設定的值更新其簽章檔案,服務永遠不會更新其簽章檔案,因為服務會從全域存放區讀取,但應用程式會寫入虛擬存放區。

  • 模擬用戶的進程。 如果進程在模擬用戶時嘗試作業,則不會虛擬化該作業。

  • 核心模式進程,例如驅動程式。

  • 已在其指令清單中指定 requestedExecutionLevel 的進程。

  • HKEY_LOCAL_MACHINE\Software\ClassesHKEY_LOCAL_MACHINE\Software\Microsoft\WindowsHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT的索引鍵和子機碼。

控制登錄虛擬化

除了在指令清單中使用 requestedExecutionLevel 來控制應用層級的虛擬化之外,系統管理員還可以針對 HKEY_LOCAL_MACHINE\Software中的密鑰啟用或停用每個密鑰的虛擬化。 若要這樣做,請使用 Reg.exe 命令行公用程式 FLAGS 選項搭配下表所列的旗標。

意義
REG_KEY_DONT_SILENT_FAIL 此旗標會停用開啟的登錄虛擬化。 如果已設定此旗標,且開啟作業在已啟用虛擬化的密鑰上失敗,登錄不會嘗試重新開啟密鑰。 如果清除此旗標,登錄會嘗試重新開啟具有MAXIMUM_ALLOWED存取權的密鑰,而不是要求存取權。
REG_KEY_DONT_VIRTUALIZE 此旗標會停用寫入登錄虛擬化。 如果已設定此旗標,且建立密鑰或設定值作業失敗,因為呼叫端沒有足夠的父密鑰存取權,登錄會失敗作業。 如果這個旗標清楚,登錄會嘗試在虛擬存放區中寫入機碼或值。 呼叫端必須具有父索引鍵上的KEY_READ。
REG_KEY_RECURSE_FLAG 如果設定此旗標,則會從父機碼傳播登錄虛擬化旗標。 如果此旗標清楚,則不會傳播登錄虛擬化旗標。 變更此旗標只會影響變更旗標之後所建立的新子系索引鍵。 它不會設定或清除現有子代索引鍵的這些旗標。

 

下列範例示範使用 Reg.exe 命令行公用程式搭配 FLAGS 選項來查詢金鑰虛擬化旗標的狀態。

C:\>reg flags HKLM\Software\AppKey1 QUERY

HKEY_LOCAL_MACHINE\Software\AppKey1

        REG_KEY_DONT_VIRTUALIZE: CLEAR
        REG_KEY_DONT_SILENT_FAIL: CLEAR
        REG_KEY_RECURSE_FLAG: CLEAR

The operation completed successfully.

每當在虛擬化的金鑰上啟用稽核時,就會產生新的虛擬化稽核事件,以指出密鑰正在虛擬化(除了一般稽核事件之外)。 系統管理員可以使用此資訊來監視其系統上的虛擬化狀態。

用戶帳戶控制用戶入門

瞭解及設定用戶帳戶控制

最低特殊許可權環境中應用程式的開發人員最佳做法和指導方針