列出所有Active Directory组

以下代码列出了一些(但不是全部)Active Directory组。 为什么?

我正在尝试列出所有安全组,通讯组,计算机组等。我是否指定了错误的objectClass

 private static void ListGroups() { DirectoryEntry objADAM = default(DirectoryEntry); DirectoryEntry objGroupEntry = default(DirectoryEntry); DirectorySearcher objSearchADAM = default(DirectorySearcher); SearchResultCollection objSearchResults = default(SearchResultCollection); SearchResult myResult=null; objADAM = new DirectoryEntry(LDAP); objADAM.RefreshCache(); objSearchADAM = new DirectorySearcher(objADAM); objSearchADAM.Filter = "(&(objectClass=group))"; objSearchADAM.SearchScope = SearchScope.Subtree; objSearchResults = objSearchADAM.FindAll(); // Enumerate groups try { fileGroups.AutoFlush = true; if (objSearchResults.Count != 0) { foreach (SearchResult objResult in objSearchResults) { myResult = objResult; objGroupEntry = objResult.GetDirectoryEntry(); Console.WriteLine(objGroupEntry.Name); fileGroups.WriteLine(objGroupEntry.Name.Substring(3)); } } else { throw new Exception("No groups found"); } } catch (PrincipalException e) { fileErrorLog.AutoFlush = true; fileErrorLog.WriteLine(e.Message + " " + myResult.Path); } catch (Exception e) { throw new Exception(e.Message); } } 

如果您使用的是.NET 3.5或更高版本,则可以使用PrincipalSearcher和“按示例查询”主体进行搜索:

 // create your domain context PrincipalContext ctx = new PrincipalContext(ContextType.Domain); // define a "query-by-example" principal - here, we search for a GroupPrincipal GroupPrincipal qbeGroup = new GroupPrincipal(ctx); // create your principal searcher passing in the QBE principal PrincipalSearcher srch = new PrincipalSearcher(qbeGroup); // find all matches foreach(var found in srch.FindAll()) { // do whatever here - "found" is of type "Principal" - it could be user, group, computer..... } 

如果您还没有 – 绝对阅读MSDN文章.NET Framework 3.5中的管理目录安全主体,它很好地展示了如何充分利用System.DirectoryServices.AccountManagement中的新function

尝试过滤“(objectcategory = group)” 这里找到解决方案

 DirectoryEntry entry = new DirectoryEntry("ldap://ldap.gaurangjadia.com", "scott", "tiger"); DirectorySearcher dSearch = new DirectorySearcher(entry); dSearch.Filter = "(&(objectClass=group))"; dSearch.SearchScope = SearchScope.Subtree; SearchResultCollection results = dSearch.FindAll(); for (int i = 0; i < results.Count; i++) { DirectoryEntry de = results[i].GetDirectoryEntry(); //TODO with "de" } 

我尝试了这个并且它有效

  public ArrayList GetAllGroupNames(string ipAddress, string ouPath) { DirectorySearcher deSearch = new DirectorySearcher(); deSearch.SearchRoot = GetRootDirectoryEntry(ipAddress, ouPath); deSearch.Filter = "(&(objectClass=group))"; SearchResultCollection results = deSearch.FindAll(); if (results.Count > 0) { ArrayList groupNames = new ArrayList(); foreach (SearchResult group in results) { var entry = new DirectoryEntry(group.Path, UserName, Password); string shortName = entry.Name.Substring(3, entry.Name.Length - 3); groupNames.Add(shortName); } return groupNames; } else { return new ArrayList(); } } private DirectoryEntry GetRootDirectoryEntry(string ipAddress, string domainPath, string username, string password) { var ldapPath = "LDAP://" + ipAddress + "/" + domainPath; return new DirectoryEntry(ldapPath, username, password, AuthenticationTypes.Secure); }