C#学习教程:递归获取活动目录组成员,包括子组是MainGroup或其任何子组的成员,代码如下:usingSystem;使用System.DirectoryServices;staticclassProgram{staticvoidMain(){DirectoryEntryuser=newDirectoryEntry("LDAP://CN=User3,DC=X,DC=y");stringfilter="(memberOf:1.2.840.113556.1.4.1941:=CN=MainGroup,DC=X,DC=y");DirectorySearchersearcher=newDirectorySearcher(user,filter);searcher.SearchScope=SearchScope.Subtree;varr=searcher.FindOne();boolisMember=(r!=null);我想知道是否有类似的方法来获取作为组或任何子组成员的所有用户,即在MainGroup的示例中获取User1、User2、User3和User4。获得所有用户的明显方法是递归查询每个子组,但我想知道是否有更简单的方法。使用与memberOf:1.2.840.113556.1.4.1941:filter相同的方法,但是使用域根而不是用户作为搜索基础是不可行的,因为对于所有用户查询花费的时间太长(可能它递归地计算所有组成员资格)在域中并检查他们是否是给定组的成员)。获取组(包括其子组)的所有成员的最佳方法是什么?如果这可能对其他人有益:这就是我最终解决的问题。这只是一个带有一些额外检查的递归搜索,以避免检查同一个组或用户两次,例如,如果groupA是groupB的成员,groupB是groupA的成员,或者如果用户是多个组的成员。以上就是C#学习教程:递归获取ActiveDirectory组的成员,即包含子组共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——usingSystem;使用System.DirectoryServices;使用System.Collections.Generic;staticclassProgram{staticIEnumerableGetMembers(DirectoryEntrysearchRoot,stringgroupDn,stringobjectClass){使用(DirectorySearchersearcher=newDirectorySearcher(searchRoot)){searcher.Filter="(&(objectClass="+objectClass+")(memberOf=+groupDn+"))";searcher.PropertiesToLoad.C??lear();searcher.PropertiesToLoad.AddRange(newstring[]{"objectGUID","sAMAccountName","distinguishedName"});searcher.Sort=newSortOption("sAMAccountName",SortDirection.Ascending);searcher.PageSize=1000;搜索器.SizeLimit=0;foreach(SearchResultresultinsearcher.FindAll()){yieldreturnresult;}}}staticIEnumerableGetUsersRecursively(DirectoryEntrysearchRoot,stringgroupDn){ListsearchedGroups=newList();列出searchedUsers=newList();返回GetUsersRecursively(searchRoot,groupDn,searchedGroups,searchedUsers);}staticIEnumerableGetUsersRecursively(DirectoryEntrysearchRoot,stringgroupDn,ListsearchedGroups,ListsearchedUsers){foreach(varsubGroupinGetMembers(searchRoot,groupDn,"group")){stringsubGroupName=((string)subGroup.Properties["sAMAccountName"][0]).ToUpperInvariant();如果(searchedGroups.Contains(subGroupName)){继续;}searchedGroups.Add(subGroupName);stringsubGroupDn=((string)subGroup.Properties["distinguishedName"][0]);foreach(varuserinGetUsersRecursively(searchRoot,subGroupDn,searchedGroups,searchedUsers)){yieldreturnuser;}}foreach(varuserinGetMembers(searchRoot,groupDn,"user")){stringuserName=((string)user.Properties["sAMAccountName"][0]).ToUpperInvariant();如果(searchedUsers.Contains(userName)){继续;}searchedUsers.Add(用户名);收益回报用户;}}staticvoidMain(string[]args){使用(DirectoryEntrysearchRoot=newDirectoryEntry("LDAP://DC=x,DC=y")){foreach(varuserinGetUsersRecursively(searchRoot,"CN=MainGroup,DC=x,DC=y")){Console.WriteLine((string)user.Properties["sAMAccountName"][0]);}}}}静态列表ad_find_all_members(stringa_sSearchRoot,stringa_sGroupDN,string[]a_asPropsToLoad){}staticListad_find_all_members(DirectoryEntrya_SearchRoot,stringa_sGroupDN,string[]a_asPropsToLoad){stringsDN="distinguishedName";stringsOC="objectClass";字符串sOC_GROUP="组";字符串[]asPropsToLoad=a_asPropsToLoad;Array.Sort(asPropsToLoad);if(Array.BinarySearch(asPropsToLoad,sDN)(refasPropsToLoad,asPropsToLoad.Length+1);asPropsToLoad[asPropsToLoad.Length-1]=sDN;}if(Array.BinarySearch(asPropsToLoad,sOC)(refasPropsToLoad,asPropsToLoad.Length+1);asPropsToLoad[asPropsToLoad.Length-1]=有机碳;}列表lsr=newList();使用(DirectorySearcherds=newDirectorySearcher(a_SearchRoot)){ds.Filter="(&(|(objectClass=group)(objectClass=user))(memberOf="+a_sGroupDN+"))";//ds.PropertiesToLoad.C??lear();ds.PropertiesToLoad.AddRange(asPropsToLoad);//ds.PageSize=1000;//ds.SizeLimit=0;foreach(SearchResultsrinds.FindAll())lsr.Add(sr);}for(inti=0;i本文采集自网络,不代表立场,如涉及侵权请点右联系管理员删除,如需转载请注明出处:
