2010-07-22 19 views
1

J'ai du code qui recherche des appartenances à des groupes locaux sur une machine. Pour chaque membre, il essaie de charger des informations sur l'utilisateur (par exemple, trouver un groupe et obtenir le nom de chacun de ses membres).Exception inattendue levée lors de la recherche d'informations utilisateur

Le code:

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

Le code fonctionne bien la plupart du temps, mais pour certains membres du groupe, il jette un FileNotFoundException lorsque la méthode RefreshCache() est jeté:

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) 

Ce qui est à l'origine le FileNotFoundException (et quel est le fichier recherché)?

+0

Une paille très courte à saisir, mais les membres du groupe en question ont-ils un "&" dans leur nom? Sinon, pouvez-vous poster des exemples de noms de membres de groupe qui causent le problème? –

+0

@Neil: non, ils ne le font pas. L'erreur se produit sur un site client et j'avais déjà posé cette question. Ils m'assurent que les noms des membres ne contiennent que des lettres. – adrianbanks

+0

Y a-t-il des systèmes pour lesquels cela fonctionne? –

Répondre

0

Je ne suis pas allé au fond de ce qui causait le FileNotFoundException, bien que je soupçonne que cela avait à voir avec la configuration de groupe - les groupes avaient à la fois des utilisateurs locaux et de domaine. Parce que j'avais seulement besoin des noms et des SID des utilisateurs, et ceux-ci étaient déjà présents sur le DirectoryEntry, j'ai résolu ce problème en n'appelant pas la méthode RefreshCache. Cela permet au code de s'exécuter sans exception.

2

L'erreur de fichier non trouvé est couramment utilisée dans l'API Win32 en tant qu'erreur «ressource non trouvée». Donc, il est retourné pour des choses comme des clés de registre manquantes, ou - dans ce cas - un nœud ADSI.

Je ne suis définitivement pas un expert ADSI, mais votre premier appel au constructeur DirectoryEntry semble utiliser un style de chemin invalide according to MSDN. Je crois que vous auriez besoin du nom de domaine avant le nom de la machine.

Mise à jour:

Remarqué ceci sur another MSDN page: « GetInfo ne peut pas être utilisé pour les groupes qui contiennent des membres qui sont des entités de sécurité bien connues dans le cadre WinNT. » Étant donné la trace de la pile, il semble que cela puisse causer le problème.

+0

La machine fait partie d'un domaine, mais j'interroge les informations sur les groupes locaux (les groupes locaux peuvent toutefois contenir des éléments de domaine). Je pensais que je n'aurais pas besoin du nom de domaine dans ce cas. – adrianbanks

+0

Dans ce cas, je voudrais essayer le chemin 'WinNT: // ', sans spécifier le type 'computer'. –

+0

Je l'ai regardé avec des yeux frais. Consultez la mise à jour de la réponse (qui est vraiment une réponse totalement différente), et voir si cela aide. –