获取另一个域上当前用户的AD组成员身份

时间:2018-05-02 16:01:54

标签: c# active-directory

我有一些代码可以为当前登录的用户获取所有AD组:

        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);

        // find a user
        UserPrincipal adUser = UserPrincipal.FindByIdentity(ctx, user);

        if (adUser == null)
        {
            Logger.Error("Could not find related Active Directory user");
            return;
        }
        GetUserDetailsFromGroupMembership(adUser.GetGroups().Select(g => g.Name));

这将获得当前用户在其注册域中所属的所有组。我的用户名是“EUR”域名的一部分,但我也拥有“USA”域名的会员资格。我如何查询其他域中的组?

1 个答案:

答案 0 :(得分:1)

GetGroups()从同一个林中的域中获取所有组,因此我必须假设您的两个域不在同一个林中,而是彼此信任。

我不知道如何使用AccountManagement命名空间执行此操作,但这是您使用DirectorySearcher执行此操作的方法。

当帐户被添加到外部受信任域上的组时,它们将显示为Foreign Security Principal对象,其中包含该帐户的SID。这就是你要搜索的内容。您已在adUser变量中拥有该帐户,因此我在此处使用adUser.Sid

我假设您将始终搜索另一个域,因此您可以在第一行中对其他域的distinguishedName进行硬编码。

var otherDomainDN = "DC=usa,domain,DC=com";
var ds = new DirectorySearcher(new DirectoryEntry($"LDAP://{otherDomainDN}"),
    $"(&(objectClass=group)(member=CN={adUser.Sid},CN=ForeignSecurityPrincipals,{otherDomainDN}))");
ds.PropertiesToLoad.Add("cn");

var otherDomainGroups = new List<string>();
foreach (SearchResult g in ds.FindAll()) {
    otherDomainGroups.Add(g.Properties["cn"][0].ToString());
}

在此之后,otherDomainGroups将是其他组名称的列表。

相关问题