Неожиданное исключение выдается при поиске информации пользователя - PullRequest
1 голос
/ 22 июля 2010

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

Код:

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>
            }
        }
    }
}

КодБольшую часть времени работает нормально, но для некоторых членов группы он выдает 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 (и какой это файлищу)?

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

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

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

Обновление:

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

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

0 голосов
/ 19 августа 2010

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

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

...