C# 未输出任何数据的列表(System.DirectoryServices)
我目前有一个查询指定机器的规范名称和CN的方法。尽管如此,在验证方法中的数据时,不会输出任何内容。我不确定我是否设置了错误的格式或没有正确过滤。我尝试了很多改变search.Filter等格式的方法,但都没有成功。下面是我的最新代码。我希望有人能看到我错过的东西C# 未输出任何数据的列表(System.DirectoryServices),c#,list,methods,active-directory,C#,List,Methods,Active Directory,我目前有一个查询指定机器的规范名称和CN的方法。尽管如此,在验证方法中的数据时,不会输出任何内容。我不确定我是否设置了错误的格式或没有正确过滤。我尝试了很多改变search.Filter等格式的方法,但都没有成功。下面是我的最新代码。我希望有人能看到我错过的东西 public class ComputersCheck { public string OU { get; set; } public string ComputerName { get;
public class ComputersCheck
{
public string OU { get; set; }
public string ComputerName { get; set; }
public override string ToString()
{
return OU + " " + " " + ComputerName;
}
}
public List<ComputersCheck> GetOU(string PCName)
{
List<ComputersCheck> Computers = new List<ComputersCheck>().ToList();
string DomainPath = "LDAP://DC=DOMAIN,DC=COM";
DirectoryEntry searchRoot = new DirectoryEntry(DomainPath);
DirectorySearcher search = new DirectorySearcher(searchRoot);
search.Filter = "(&(objectClass=Computer)(computerName=MACHINE_NAME))";
search.PropertiesToLoad.Add("CN");
search.PropertiesToLoad.Add("Canonical Name");
SearchResult result;
SearchResultCollection resultCol = search.FindAll();
if (resultCol != null)
{
for (int counter = 0; counter < resultCol.Count; counter++)
{
string ComputerNameOUString = string.Empty;
result = resultCol[counter];
if(result.Properties.Contains("CN") &&
result.Properties.Contains("Canonical Name"))
{
ComputersCheck objSurveyComputers = new ComputersCheck();
objSurveyComputers.ComputerName = (String)result.Properties["CN"][0];
objSurveyComputers.OU = (String)result.Properties["Canonical Name"][0];
Computers.Add(objSurveyComputers);
}
}
}
foreach (ComputersCheck computer in Computers)
{
Console.WriteLine(computer);
}
search.Dispose();
searchRoot.Dispose();
return Computers;
}
您确实有一些事情需要纠正: 没有computerName属性。将调用您要查找的属性,该属性与用于用户帐户的用户名的属性相同。但是,对于计算机,它是计算机名后跟$字符。因此,您的搜索应该如下所示: 属性名称从来没有空格。您需要属性。我看到您正在将其分配给名为OU的属性。请注意,canonicalName在末尾包含对象本身的名称,而不仅仅是OU。 您正在调用。在两个对象上进行Dispose,这很好,但不是绝对需要。但要处理的最重要的是resultCol,因为 由于实现限制,SearchResultCollection类在垃圾收集时无法释放其所有非托管资源。为了防止内存泄漏,当不再需要SearchResultCollection对象时,必须调用Dispose方法
您也可以将其放入a中,而不是调用。手动处置,这将产生相同的效果。谢谢!这篇文章写得很好,我感谢你的帮助。我计划修改canonicalName值以去掉对象本身的名称。我要到明天才能测试这个,但我会在测试后做出回应。我不知道SearchResultCollection类没有释放其所有非托管资源,感谢您提供此信息。我最不想看到的是内存泄漏,我必须通过1000行代码才能找到。没问题。很乐意帮忙。我已经在这里记录了一些其他的技巧,尽管在这个特定的案例中你没有更多的技巧可以应用:伟大的阅读。对于这些类型的场景非常详细和有组织。非常感谢。
(&(objectClass=computer)(sAMAccountName=MACHINE_NAME$))
search.PropertiesToLoad.Add("canonicalName");
...
objSurveyComputers.OU = (String)result.Properties["canonicalName"][0];