我正在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那样为您提供对象列表...
谢谢
答案 0 :(得分:1)
您快到了。一些事情:
DirectorySearcher
不会得到返回它认为整页的内容,它将停止询问)PropertiesToLoad
集合中。如果您不添加任何内容,它将为您提供每个属性一个值,这是一堆您不会使用的不必要数据。您可能只想看到cn
属性(公用名)。FindAll()
获得结果。确保将其包装在using
语句中,以防止内存泄漏(文档中是这样说的)。[0]
。供将来参考(此处不适用):如果未在AD中设置属性,则该属性将根本不在Properties
集合中,因此,对于可选属性,必须使用{{1} },看看是否先到那里。使用现有的方法,这是一种将返回计算机名称列表的方法:
Properties.Contains()
更新:要在评论中回答您的问题,
yield
基本上告诉它“将此项添加到将要返回的集合中”。后台还有其他事情要做,您可以阅读有关here的内容。但是用最简单的话来说,它使您不必创建自己的列表,在列表中添加项目并返回列表。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
,因为您从搜索中获得了多个结果,所以我假设您想返回所有这些结果。此方法将为您提供计算机名称列表,而不仅仅是一个计算机名称。IEnumerable<string>
返回一个SearchResultCollection
。由于某些原因,我不知道,FindAll()
中从SearchResultCollection
返回的对象表示为foreach
。因此,您需要将它们强制转换为object
才能使用它们。