Список без вывода каких-либо данных (System.DirectoryServices) - PullRequest
0 голосов
/ 09 октября 2019

В настоящее время у меня есть метод, который запрашивает каноническое имя и 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 Ответ

1 голос
/ 10 октября 2019

У вас есть несколько вещей, которые необходимо исправить:

  1. Нет атрибута computerName. Атрибут, который вам нужен, называется sAMAccountName, который является тем же атрибутом, который используется для имени пользователя для учетных записей пользователей. Однако для компьютеров это имя компьютера, за которым следует символ $. Поэтому ваш поиск должен выглядеть так:
(&(objectClass=computer)(sAMAccountName=MACHINE_NAME$))
Имена атрибутов никогда не имеют пробелов. Вам нужен атрибут canonicalName. Я вижу, что вы присваиваете его свойству OU. Просто помните, что canonicalName включает в себя имя самого объекта в конце, а не только OU.
search.PropertiesToLoad.Add("canonicalName");
...
objSurveyComputers.OU = (String)result.Properties["canonicalName"][0];
Вы звоните .Dispose() на пару объектов, что нормально (хотя и не обязательно). Но наиболее важным из них является resultCol, поскольку в документации для SearchResultCollection написано:

Из-за ограничений реализации класс SearchResultCollection не может освободить всеего неуправляемых ресурсов, когда это мусор. Чтобы предотвратить утечку памяти, вы должны вызывать метод Dispose, когда объект SearchResultCollection больше не нужен.

Вы также можете поместить его в оператор using вместо вызова.Dispose() вручную, что будет иметь тот же эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...