2010-07-22 1 views
1

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

Код:

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 (и какой файл он ищет)?

+0

Очень короткая солома для сцепления, но имеют ли члены группы, у которых есть «&» на их имя? Если нет, можете ли вы разместить несколько имен членов группы образцов, которые вызывают проблему? –

+0

@Neil: нет, они этого не делают. Ошибка происходит на сайте клиента, и я уже задал этот вопрос. Они заверяют меня, что имена участников содержат только буквы. – adrianbanks

+0

Существуют ли системы, для которых это работает? –

ответ

0

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

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

2

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

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

Update:

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

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

+0

Машина является частью домена, но я запрашиваю информацию о локальных группах (хотя локальные группы могут содержать элементы домена). Я думал, что в этом случае мне не понадобится доменное имя. – adrianbanks

+0

В этом случае я бы попробовал путь 'WinNT: // ', не указав тип 'computer'. –

+0

Я посмотрел на него свежими глазами. Проверьте обновление ответа (это действительно совсем другой ответ) и посмотрите, поможет ли это. –