我有一个用户,我当前正在列出“ memberOf”。我想获取有关用户所属的每个组的一些详细信息,例如distinguishedName,上次修改的内容和说明...问题是,我在代码中使用FindOne(),并且我有几个带有sAMAccountName的组在各个域中重复的文件。有没有一种方法可以使用FindOne()来获取组的第二次出现,正如我在下面编写的那样,还是我需要重写并使用FindAll()并以这种方式进行处理。 相关代码如下:
foreach (object item in groups)
{
string groupProp = string.Empty;
using (DirectoryEntry dirEntry = CreateDirectoryEntry())
{
using (DirectorySearcher dirSearcher2 = new DirectorySearcher(dirEntry))
{
dirSearcher2.Filter = string.Format("(sAMAccountName=" + item + ")");
dirSearcher2.PropertiesToLoad.Add("description");
dirSearcher2.PropertiesToLoad.Add("whenChanged");
dirSearcher2.PropertiesToLoad.Add("distinguishedName");
SearchResult searchResult2 = dirSearcher2.FindOne();
if (searchResult2 != null)
{
DirectoryEntry employee = searchResult2.GetDirectoryEntry();
string desc = string.Empty;
string date = string.Empty;
string dname = string.Empty;
if (employee.Properties["description"].Value != null)
{
desc = employee.Properties["description"].Value.ToString();
}
if (employee.Properties["whenChanged"].Value != null)
{
date = employee.Properties["whenChanged"].Value.ToString();
}
if (employee.Properties["distinguishedName"].Value != null)
{
dname = employee.Properties["distinguishedName"].Value.ToString();
if (dname.Contains("DC=academic"))
{
dname = "academic";
}
}
}
}
}
相关新代码:
using (var results = dirSearcher2.FindAll())
{
foreach (SearchResult searchResult2 in results)
{
html.Append("<tr><td>" + item.ToString() + "</td>");
if (searchResult2.Properties.Contains("description"))
{
desc = searchResult2.Properties["description"][0].ToString();
}
if (searchResult2.Properties.Contains("whenChanged"))
{
date = searchResult2.Properties["whenChanged"][0].ToString();
}
if (searchResult2.Properties.Contains("distinguishedName"))
{
dom = searchResult2.Properties["distinguishedName"][0].ToString();
if (dom.Contains("DC=academic"))
{
dname = "academic";
}
else if (dom.Contains("DC=office"))
{
dname = "office";
}
else
{
dname = "not listed";
}
}
html.Append("<td>" + desc + "</td><td>" + dname + "</td><td>" + date + "</td></tr>");
}
从本质上讲,我得到的结果与第一个代码得到的结果相同,IE在第二个组上没有得到正确的信息。 IE:我有两个名为AppDev的组,它们都位于不同的域中;但是,两者都显示学术。当我查看AD时,我看到一个可分辨的名字在一组上显示DC = office,尽管上面的代码并没有做到这一点。
答案 0 :(得分:1)
FindOne()
仅找到一个。如果您需要查看更多内容,则需要使用FindAll()
。只需确保将结果包装在using
语句中即可,因为documentation表示如果不这样做,可能会导致内存泄漏:
using (var results = dirSearcher2.FindAll()) {
foreach (SearchResult searchResult2 in results) {
//do stuff
}
}
如果只想查找2(例如,如果只需要知道是否存在多个),则可以将DirectorySearcher
的{{3}}属性设置为{{1} }:
2
关于效率的说明:当您使用dirSearcher2.SizeLimit = 2;
然后从.GetDirectoryEntry()
对象获取属性时,DirectoryEntry
实际上会返回AD以获取那些属性,即使您已经在搜索过程中找到了它们。您已经使用DirectoryEntry
来请求这些属性,因此它们在PropertiesToLoad
对象中已经可用。请注意,SearchResult
的{{1}}列表中的所有属性都以数组形式显示,因此,即使它们是AD中的单值属性,也始终需要使用Properties
。>
SearchResult
如果还需要确保您正在搜索“全局目录”,则它将返回林中所有域的结果。为此,您可以使用[0]
(而不是if (searchResult2.Properties.Contains("description")) {
desc = searchResult2.Properties["description"][0];
}
)来创建用于DirectoryEntry
的{{1}}。这告诉它使用端口3268(GC端口)而不是默认的LDAP端口(389)。您正在通过SearchRoot
方法创建该对象。