Непредвиденная исключительная ситуация, брошенная при поиске информации о пользователе

У меня есть некоторый код, который ищет составы группы от локальных групп на машине. Для каждого участника это пытается загрузить некоторую информацию о пользователе (например, найти группу и получить названия каждого из ее участников).

Код:

using (DirectoryEntry machine = new DirectoryEntry("WinNT://" + Environment.MachineName + ", Computer"))
{
    using (DirectoryEntry group = machine.Children.Find(groupName, "group"))
    {
        object members = group.Invoke("members", null);

        foreach (object groupMember in (IEnumerable) members)
        {
            using (DirectoryEntry member = new DirectoryEntry(groupMember))
            {
                member.RefreshCache();
                string name = member.Name;
                // <code snipped>
            }
        }
    }
}

Код хорошо работает большую часть времени, но для некоторых элементов группы, он бросает a FileNotFoundException когда RefreshCache() метод брошен:

System.IO.FileNotFoundException: 
    The filename, directory name, or volume label syntax is incorrect.
    (Exception from HRESULT: 0x8007007B)
at System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo()
at System.DirectoryServices.DirectoryEntry.RefreshCache()
at GroupLookup.GetLocalGroupMembership(String groupName)

Что вызывает FileNotFoundException (и какой файл это ищет)?

1
задан ekad 24 November 2017 в 07:47
поделиться

2 ответа

Мне не удалось выяснить причину FileNotFoundException, хотя я подозреваю, что это было связано с настройкой групп - в группах были как локальные, так и доменные пользователи.

Поскольку мне нужны были только имена и SID пользователей, а они уже присутствовали в DirectoryEntry, я решил эту проблему, не вызывая метод RefreshCache. Это позволило выполнить код без исключения.

0
ответ дан 2 September 2019 в 22:51
поделиться

Ошибка «Файл не найден» обычно используется в WIN32 API как ошибка «ресурс не найден». Таким образом, он возвращается для таких вещей, как отсутствующие разделы реестра или- в данном случае - узел ADSI.

Я определенно не эксперт ADSI, но ваш первый вызов конструктора DirectoryEntry, по-видимому, использует недопустимый стиль пути в соответствии с MSDN. Я считаю, что вам понадобится доменное имя перед именем машины.

Обновление:

Заметил это на другой странице MSDN: «GetInfo нельзя использовать для групп, содержащих членов, которые являются хорошо известными субъектами безопасности в области WinNT».

Учитывая трассировку стека, кажется, что это может быть причиной проблемы.

2
ответ дан 2 September 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: