【问题标题】:Difference between NativeGuid and Guid in Active DirectoryActive Directory 中 NativeGuid 和 Guid 的区别
【发布时间】:2010-12-11 07:50:52
【问题描述】:

我需要更新一些 AD 查询代码,并希望使用新的 .NET 3.5 System.DirectoryServices.AccountManagement 对象以托管方式查询 AD,而不是我们当前使用 LDAP 的方法。

我在读取 UserPrincipal.Guid 值时遇到了一个奇怪的问题。事实证明,它与我们通过 LDAP 使用的 Guid 相似但不同。

起初它们看起来完全不同,但在第二次拍摄时,我发现后半部分是相同的,前半部分只是简单地转置了,即:

新 (.NET 3.5) 方法 GUID: 01234567-89ab-cdef-0123-456789abcdef
上一页 (LDAP) 方法 GUID: 67452301-ab89-efcd-0123-456789abcdef

我检查了 LDAP 代码,发现我们正在使用 SearchResult.GetDirectoryEntry().NativeGuid 字段来获取旧 Guid。

它有一个名为 SearchResult.GetDirectoryEntry().Guid 的不同属性,它与我使用新的 .Net 3.5 类检索的 GUID 相同。

我的问题是,为什么它们(有点)不同,我应该使用哪个?

【问题讨论】:

    标签: .net-3.5 active-directory


    【解决方案1】:

    正如您已经猜到的那样,它们都是完全相同的值的表示。区别在于格式; DirectoryEntry.NativeGUID 以小端顺序(不带破折号)显示,这是它在目录服务中“本地”存储的方式,UserPricipal.GUID/DirectoryEntry.GUID 以大端顺序(带破折号)显示。有关详细信息,请参阅Endianess 上的维基百科文章。

    因此,当您打印出 NativeGUID(字符串)的值时,它不应显示任何破折号(就像您的示例一样),除非您使用字符串作为输入 (Guid ng = new Guid(de.NativeGuid);) 创建新的 GUID。这会造成一些混乱......

    在将 GUID 存储在外部数据源中或将 NativeGUID 存储为大端 GUID 时,重要的是不要将两者混合。

    所以我会选择 UserPricipal.GUID/DirectoryEntry.GUID,因为这是使用大多数 Windows 管理工具(例如 Active Directory 用户和计算机以及 ADSI Edit)显示 objectGUID 属性的方式以及它在 SQL 中的存储和显示方式使用 uniqueidentifier 数据类型时的服务器。还;您需要“低于” UserPrincipal (GetUnderlyingObject()) 以获取 NativeGUID 值(或将 UserPrincipal.GUID 属性转换为 little-endian)。

    所以我想您必须决定是将现有的“外部”数据迁移到 GUID 格式还是继续使用 NativeGUID 格式。现在我猜你介于两者之间。

    【讨论】:

    • 谢谢!这是一个巨大的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多