identityReference.Translate(typeof(System.Security.Principal.NTAccount))。ToString()不提供完整的域名

时间:2018-11-19 11:43:26

标签: c# .net active-directory

我想获取分配给用户的所有组。我使用了下面提到的代码块:

WindowsIdentity windowsIdentity = new WindowsIdentity(userName);

IdentityReferenceCollection irc = windowsIdentity.Groups;

Console.WriteLine("The groups identified are : ");
foreach (IdentityReference identityReference in irc)
    Console.WriteLine(identityReference.Translate(typeof(System.Security.Principal.NTAccount)).ToString());

该用户的组详细信息之一是:

    该组的
  • 域名是example.com
  • 组名是Group1

预期输出为:example.com\Group1

我得到的输出是:example\Group1

任何人都可以建议如何获得预期的输出。

预先感谢

1 个答案:

答案 0 :(得分:0)

您的域有两个名称:

  • DNS名称,可以在DNS中查找,例如example.com
  • NetBIOS名称,它是域的缩写,为方便起见而使用,例如EXAMPLE

NetBIOS名称通常与DNS名称相似,但不带点。但是,它不必类似。您可能具有example.com的域DNS,但是NetBIOS名称为MYDOMAIN

当对象显示为domain\username格式时,将始终使用NetBIOS名称。这就是为什么您看到EXAMPLE\Group1的原因。因此,这完全是正常的并且是预期的。

您是否有任何理由必须以DNS name\username的格式使用它?我不知道这是什么要求。

作为旁注,我写了一篇有关获取所有用户组的文章,您可能会有所帮助,或者可能找不到帮助:Finding all of a user’s groups

更新:如果您确实需要DNS name\username格式,可以尝试一下(此方法未经测试,但应该关闭了)。这将使用SID在AD中找到该组,然后从canonicalName属性中拉出域的DNS名称。

foreach (SecurityIdentifier groupSid in irc) {
    using (var group = new DirectoryEntry("LDAP://<SID=" + groupSid.Value + ">")) {
        group.RefreshCache(new [] { "canonicalName", "sAMAccountName" });
        var canonicalName = group.Properties["canonicalName"].Value.ToString();
        var domainDns = canonicalName.Substring(0, canonicalName.IndexOf("/"));
        Console.WriteLine(domainDns + "\\" + group.Properties["sAMAccountName"].Value);
    }
}