我有一些代码可以为当前登录的用户获取所有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”域名的会员资格。我如何查询其他域中的组?
答案 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
将是其他组名称的列表。