[英]List not outputting any data (System.DirectoryServices)
我目前有一种方法可以查询指定机器的规范名称和 CN。 虽然,在验证方法内的数据时,没有输出任何内容。 我不确定我的格式是否错误或没有正确过滤。 我尝试了很多事情(更改search.Filter
的格式)等,但无济于事。 以下是我拥有的最新代码。 我希望有人会看到我缺少的东西。
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
属性。 您所使用的属性称为sAMAccountName
,它与用于用户帐户的用户名的属性相同。 但是,对于计算机,它是计算机名称后跟$
字符。 所以你的搜索应该是这样的:(&(objectClass=computer)(sAMAccountName=MACHINE_NAME$))
canonicalName
属性。 我看到您将其分配给一个名为OU
的属性。 请注意, canonicalName
最后包含 object 本身的名称,而不仅仅是 OU。search.PropertiesToLoad.Add("canonicalName");
...
objSurveyComputers.OU = (String)result.Properties["canonicalName"][0];
.Dispose()
,这很好(尽管不是绝对需要)。 但最重要的是要处理的是resultCol
,因为SearchResultCollection
的文档说:由于实施限制,SearchResultCollection class 在垃圾回收时无法释放其所有非托管资源。 为防止 memory 泄漏,您必须在不再需要 SearchResultCollection object 时调用 Dispose 方法。
您也可以将其放在using
语句中,而不是手动调用.Dispose()
,这将具有相同的效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.