繁体   English   中英

列表不输出任何数据(System.DirectoryServices)

[英]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;
    }

你确实有一些事情需要纠正:

  1. 没有computerName属性。 您所使用的属性称为sAMAccountName ,它与用于用户帐户的用户名的属性相同。 但是,对于计算机,它是计算机名称后跟$字符。 所以你的搜索应该是这样的:
(&(objectClass=computer)(sAMAccountName=MACHINE_NAME$))
  1. 属性名称从不包含空格。 您需要canonicalName属性。 我看到您将其分配给一个名为OU的属性。 请注意, canonicalName最后包含 object 本身的名称,而不仅仅是 OU。
search.PropertiesToLoad.Add("canonicalName");
...
objSurveyComputers.OU = (String)result.Properties["canonicalName"][0];
  1. 您正在对几个对象调用.Dispose() ,这很好(尽管不是绝对需要)。 但最重要的是要处理的是resultCol ,因为SearchResultCollection的文档说:

由于实施限制,SearchResultCollection class 在垃圾回收时无法释放其所有非托管资源。 为防止 memory 泄漏,您必须在不再需要 SearchResultCollection object 时调用 Dispose 方法。

您也可以将其放在using语句中,而不是手动调用.Dispose() ,这将具有相同的效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM