在C#中查询LDAP以获取计算机列表

时间:2018-12-16 00:34:16

标签: c# active-directory ldap

我正在Windows Forms C#项目中使用LDAP。

我创建了一个CheckListBox,并开始创建一种方法来查询Active Directory中所有我的计算机所在的环境。

方法是:

public string ComputerList()
{
        DirectoryEntry rootDSE = new DirectoryEntry("LDAP://MyDomain.Local");

        DirectorySearcher computerSercher = new DirectorySearcher(rootDSE);

        computerSercher.PageSize = 10000;
        computerSercher.Filter = "(&(objectClass=computer))";
}

我也有一个CheckListBox。

我想做的是查询和找到的每台计算机都有结果。将其添加到CheckListBox的Items属性。

但是我什至不怎么接近结果。不是像PowerShell那样为您提供对象列表...

谢谢

1 个答案:

答案 0 :(得分:1)

您快到了。一些事情:

  1. 将页面大小设置为1000。广告一次不会给您超过1000,因此,如果将其设置为超过1000,则只会得到1000(如果DirectorySearcher不会得到返回它认为整页的内容,它将停止询问)
  2. 将要读取的属性添加到PropertiesToLoad集合中。如果您不添加任何内容,它将为您提供每个属性一个值,这是一堆您不会使用的不必要数据。您可能只想看到cn属性(公用名)。
  3. 使用FindAll()获得结果。确保将其包装在using语句中,以防止内存泄漏(文档中是这样说的)。
  4. 查看结果时,无论是否在AD中,每个属性都以数组形式显示。因此,在大多数情况下,您需要使用[0]。供将来参考(此处不适用):如果未在AD中设置属性,则该属性将根本不在Properties集合中,因此,对于可选属性,必须使用{{1} },看看是否先到那里。

使用现有的方法,这是一种将返回计算机名称列表的方法:

Properties.Contains()

更新:要在评论中回答您的问题,

  1. yield基本上告诉它“将此项添加到将要返回的集合中”。后台还有其他事情要做,您可以阅读有关here的内容。但是用最简单的话来说,它使您不必创建自己的列表,在列表中添加项目并返回列表。
  2. 我将返回类型从public IEnumerable<string> ComputerList() { DirectoryEntry rootDSE = new DirectoryEntry("LDAP://MyDomain.Local"); DirectorySearcher computerSercher = new DirectorySearcher(rootDSE) { PageSize = 1000, Filter = "(&(objectClass=computer))" }; computerSercher.PropertiesToLoad.Add("cn"); using (var results = computerSercher.FindAll()) { foreach (SearchResult result in results) { yield return (string) result.Properties["cn"][0]; } } } 更改为string,因为您从搜索中获得了多个结果,所以我假设您想返回所有这些结果。此方法将为您提供计算机名称列表,而不仅仅是一个计算机名称。
  3. IEnumerable<string>返回一个SearchResultCollection。由于某些原因,我不知道,FindAll()中从SearchResultCollection返回的对象表示为foreach。因此,您需要将它们强制转换为object才能使用它们。