Исключение класса DirectorySearcher вне диапазона - PullRequest
0 голосов
/ 03 декабря 2018

Кажется, я не могу вернуть какие-либо значимые результаты поиска, когда выполняю поиск в каталоге для ключа восстановления BitLocker.

DirectoryEntry entry = new DirectoryEntry("LDAP://OU=MYOU,DC=MYDC", adminUsername,
            adminPassword);
        entry.Username = AdminInformation.AdminUsername;
        entry.Password = AdminInformation.AdminPassword;

        DirectorySearcher search = new DirectorySearcher(entry);
        search.PropertiesToLoad.Add("msFVE-RecoveryPassword");
        search.Filter = $"(&(cn={chosenComputer}))";

        foreach (SearchResult res in result)
        {
            textBoxBitLockerKey.Text = (res.Properties["msFVE-RecoveryPassword"][0].ToString());
        }

В основном я заполнил список компьютерами, которые содержали бы ключ BitLocker (мыесть только ноутбуки, которые используют BitLocker в нашей организации).После того, как пользователь выберет ноутбук, соответствующий ключ BitLocker должен быть заполнен в текстовом поле, которое он может скопировать или распечатать, но каждый раз, когда я пытаюсь получить этот ключ с выбранного компьютера, я продолжаю получать исключение «вне границ».Я использовал DirectorySearcher для поиска других свойств, таких как учетная запись пользователя или имя компьютера, но это доставляет мне проблемы.Я понимаю, в чем ошибка, я просто не знаю, что ее вызывает, и я не могу найти других ответов, которые бы полностью охватили эту тему.Любой вклад приветствуется.

Вот исключение: индекс был вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: index.

При дальнейшем исследовании выясняется, что средство поиска каталогов ищет только те свойства, которые инкапсулируют свойство msFVE-RecoveryInformation.Если я попытаюсь добавить фильтр на основе выбранного имени компьютера, он не предоставит свойству SearchResult фактическое значение.Например, если я пытаюсь установить фильтр на основе «cn», он возвращает GUID для ключа BitLocker.

1 Ответ

0 голосов
/ 03 декабря 2018

Всякий раз, когда я запрашиваю необязательное свойство из AD по LDAP (свойство, которое не обязательно присутствует во всех объектах, которые находит DirectorySearcher), я использую этот шаблон:

const string propertykey = "msFVE-RecoveryPassword";
if (res.Properties.Contains(propertykey))
{
    string value = res.Properties[propertykey][0].ToString();
}

Использование [0] индекс обычно считается безопасным для свойств с одним значением;вы можете добавить проверку для Count> 0, если вы имеете дело со многозначным свойством (или используете перечислитель).

...