Active Directory 中 NativeGuid 和 Guid 的區別
我需要更新一些 AD 查詢程式碼,並希望使用新的 .NET 3.5 System.DirectoryServices.AccountManagement 對像以託管方式查詢 AD,而不是我們目前使用 LDAP 的方法。
我在讀取 UserPrincipal.Guid 值時遇到了一個奇怪的問題。事實證明,它與我們通過 LDAP 使用的 Guid 相似但不同。
起初它們看起來完全不同,但在第二次拍攝時,我看到後半部分是相同的,而前半部分只是簡單地轉置了,即:
新 (.NET 3.5) 方法 GUID: 01234567-89ab-cdef-0123-456789abcdef
Prev (LDAP) 方法 GUID: 67452301-ab89-efcd-0123-456789abcdef
我檢查了 LDAP 程式碼,發現我們正在使用 SearchResult.GetDirectoryEntry().NativeGuid 欄位來獲取舊的 Guid。
它有一個名為 SearchResult.GetDirectoryEntry().Guid 的不同屬性,它與我使用新的 .Net 3.5 類檢索的 GUID 相同。
我的問題是,為什麼它們(有點)不同,我應該使用哪個?
正如您已經猜到的那樣,它們都是完全相同的值的表示。區別在於格式;
DirectoryEntry.NativeGUID以小端順序(不帶破折號)顯示,這是它在目錄服務中“本地”儲存的方式,並UserPricipal.GUID/DirectoryEntry.GUID以大端順序(帶破折號)顯示。有關詳細資訊,請參閱有關Endianess的 Wikipedia 文章。因此,當您列印出 NativeGUID(字元串)的值時,它不應該顯示任何破折號(就像您的範例一樣),除非您使用字元串作為輸入(
Guid ng = new Guid(de.NativeGuid);)創建新的 GUID。這會造成一些混亂……重要的是在將 GUID 儲存在外部數據源中或將 NativeGUID 儲存為大端 GUID 時不要將兩者混合。
所以我會選擇 UserPricipal.GUID/DirectoryEntry.GUID,因為這是使用大多數 Windows 管理工具(例如 Active Directory 使用者和電腦和 ADSI Edit)來顯示 objectGUID 屬性的方式,以及當您在 SQL Server 中儲存和顯示它的方式時使用
uniqueidentifier數據類型。還; 您需要“低於” UserPrincipal (GetUnderlyingObject()) 以獲取 NativeGUID 值(或將 UserPrincipal.GUID 屬性轉換為 little-endian)。所以我想你必須決定是將現有的“外部”數據遷移到 GUID 格式還是繼續使用 NativeGUID 格式。現在我猜你介於兩者之間。