登錄虛擬化

登錄虛擬化 是一種應用程式相容性技術,可讓具有全域影響的登錄寫入作業重新導向至每個使用者位置。 對讀取或寫入登錄的應用程式而言,此重新導向是透明的。 從 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) 。

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

開啟登錄虛擬化

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

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

寫入登錄虛擬化

如果呼叫端沒有金鑰的寫入權限,並嘗試將值寫入其中或建立子機碼,該值就會寫入虛擬存放區。

例如,如果有限的使用者嘗試將值寫入下列機碼: 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 > 刪除 V3_Classes\VirtualStore\Machine\Software\AppKey1,但HKEY_LOCAL_MACHINE\Software\AppKey1有值 V3,則會從全域存放區傳回該值。

登錄虛擬化範圍

僅針對下列專案啟用登錄虛擬化:

  • 32 位互動式進程。
  • HKEY_LOCAL_MACHINE\Software中的索引鍵。
  • 系統管理員可以寫入的金鑰。 (如果系統管理員無法寫入金鑰,即使應用程式是由 administrator.)

登錄虛擬化已針對下列專案停用:

  • 64 位進程。

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

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

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

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

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

  • HKEY_LOCAL_MACHINE\Software\ClassesHKEY_LOCAL_MACHINE\Software\Microsoft\Windows和HKEY_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.

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

使用使用者帳戶控制消費者入門

瞭解和設定使用者帳戶控制

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