如何从活动目录中转储用户?

时间:2010-10-19 07:48:02

标签: c# active-directory

我在简单的console-dump-program中苦苦挣扎。我使用

连接到AD
DirectoryEntry entry =
    new DirectoryEntry("LDAP://" + domain, username, password);

从那里我通过

递归循环每个孩子
foreach (DirectoryEntry child in entry.Children)
{
    Traverse(child);
}

然后我开始获取mambo jambo数据,用户弹出更多然后null对象,所以我想知道我处理AD的方式是否只是一个句柄而不是副本因此当我开始遍历它时它没有完全加载?

有关如何做的任何提示/指示?

1 个答案:

答案 0 :(得分:3)

如果可以,请升级到.NET 3.5并使用新的System.DirectoryServices.AccountManagement命名空间 - 更容易使用。

请参阅:Managing Directory Security Principals in the .NET Framework 3.5

另外:您需要了解Active Directory不仅仅是一个用户和组的平面列表 - 它是一个OU(组织单位)的层次系统,可以相互嵌套,并且可以包含用户,组,计算机和更多。

那你究竟想做什么?获取给定OU的用户(例如“Sales”)??或者真的从你的AD获得所有用户?你明白这可能需要一段时间,这取决于公司AD的大小.......

如果您真的想要从整个AD获得所有用户和所有组 - 您应该在根级设置DirectorySearcher:< / p>

// set search root
DirectoryEntry deRoot = new DirectoryEntry("LDAP://dc=YourCompany,dc=com");

// declare directory searcher
DirectorySearcher dsUsers = new DirectorySearcher(deRoot);

// scope is full subtree, filter defines to search for users
dsUsers.SearchScope = SearchScope.SubTree;
dsUsers.Filter = "(objectCategory=person)";

// define what properties you want to have loaded into your search results
dsUsers.PropertiesToLoad.Add("givenName");
dsUsers.PropertiesToLoad.Add("surname");
dsUsers.PropertiesToLoad.Add("samAccountName");

// loop through results of search
foreach(SearchResult result in dsUsers.FindAll())
{
   if(result.Properties["givenName"] != null)
      string givenName = result.Properties["givenName"][0].ToString();

   if(result.Properties["surname"] != null)
      string surname = result.Properties["surname"][0].ToString();

   if(result.Properties["sAMAccountName"] != null)
      string samAccountName = result.Properties["sAMAccountName"][0].ToString();
}

当你读出SearchResult的属性时,你需要检查以确保你确实得到了一个值 - 否则你的作业会崩溃并燃烧......

对于群组,只需使用此过滤器:

dsUsers.Filter = "(objectCategory=group)";

如果您可以缩小搜索范围,例如对于给定的OU,您可以获得更好的性能,因为搜索树变得更小,因此搜索速度会快得多。为此,只需为deRoot目录条目定义不同的LDAP路径(例如LDAP://OU=Sales,DC=YourCOmpany,DC=com或您要搜索的任何OU)。

更新:正如我所说 - 使用.NET 3.5,它仍然变得更加容易!您需要添加对System.DirectoryServices.AccountManagement的引用,然后您可以使用某种“按示例查询”方法使用类似的代码:

// create a domain context for the current domain
PrincipalContext domain = new PrincipalContext(ContextType.Domain);

// create a principal object decsribing what to search for
UserPrincipal user = new UserPrincipal(domain);
user.IsActive = true;

// create a principal searcher for running a search operation
PrincipalSearcher searcher = new PrincipalSearcher(user);

// run the query
PrincipalSearchResult<Principal> results = searcher.FindAll();

// iterate over all results
foreach (Principal result in results)
{
    Console.WriteLine("name: {0}", result.Name);
}

要搜索群组,只需实例化GroupPrincipal,在其上设置任何属性,然后将其传递到PrincipalSearcher以搜索群组。