AD 获取具有继承成员身份的组中的用户
本文关键字:用户 身份 成员 获取 继承 AD | 更新日期: 2023-09-27 18:35:53
我正在尝试导出特定AD组的成员。我有一个有效的解决方案来获取 ALL 和过滤,但如果我想要的组有 5 个可能的用户中的 1000 个,这似乎有些过分。
我正在朝这个方向努力:
public void PrintMembers(string groupname, string domain)
{
GroupPrincipal group = GroupPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain, domain), groupname);
foreach (Principal princ in group.Members)
{
if (princ.StructuralObjectClass == "user")
{
Response.Write(UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain, domain), princ.Name));
}
}
}
这种方法有效,但无法为通过基础组继承成员资格的成员提供信息。
所以:"特定组 1" = 我让所有 5 个成员都没问题
"特定组 2"= 我让所有 7 名成员都没问题
"母组",包含上面的两个组=我没有成员...
我可以迭代该组子组,但觉得必须有另一种方法......
有什么建议吗?
GetMembers(true)
有什么问题吗?
static void Main(string[] args)
{
foreach (string user in GetMemberNames("My Group", "domain.local"))
{
Console.WriteLine(user);
}
Console.ReadKey();
}
public static string[] GetMemberNames(string groupname, string domain)
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain))
using (GroupPrincipal group = GroupPrincipal.FindByIdentity(context, groupname))
using (PrincipalSearchResult<Principal> results = group.GetMembers(true))
{
return results.OfType<UserPrincipal>().Select(u => u.SamAccountName).ToArray();
}
}
首先:@shriop指出您问题的确切答案。
就赏金而言,也就是说:"一种使用LDAP协议枚举组中的用户及其子组而不递归的解决方案"。这是从Windows Server 2003 SP2开始与Active-Directory一起工作的东西,称为LDAP_MATCHING_RULE_IN_CHAIN。它以递归方式(但在一个查询中)搜索组中的所有用户(请注意,它会从安全组和通讯组返回用户)。下面是 C# 中的 ADSI 用法:
static void Main(string[] args)
{
/* Connection to Active Directory
*/
string sFromWhere = "LDAP://SRVENTR2:389/dc=societe,dc=fr";
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "societe''administrateur", "test.2011");
/* To find all the users member of groups "Grp1" :
* Set the base to the groups container DN; for example root DN (dc=societe,dc=fr)
* Set the scope to subtree
* Use the following filter :
* (member:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=X)
*/
DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=societe,DC=fr)(objectCategory=user))";
dsLookFor.SearchScope = SearchScope.Subtree;
dsLookFor.PropertiesToLoad.Add("cn");
dsLookFor.PropertiesToLoad.Add("samAccountName");
SearchResultCollection srcUsers = dsLookFor.FindAll();
/* Just show each user
*/
foreach (SearchResult srcUser in srcUsers)
{
Console.WriteLine("{0}", srcUser.Path);
Console.WriteLine("{0}", srcUser.Properties["samAccountName"][0]);
}
Console.ReadLine();
}