2010-07-22 20 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> 
      } 
     } 
    } 
} 

的代码工作正常的大部分时间,但对于一些小组成员,它抛出一个FileNotFoundExceptionRefreshCache()方法时抛出:

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

一个非常短的稻草来抓住,但有问题的组成员有一个“&”在他们的名字? 如果不是,您可以发布一些导致问题的示例组成员名称吗? – 2010-07-22 10:55:28

+0

@尼尔:不,他们没有。错误发生在客户现场,我已经问过这个问题。他们向我保证,会员名称只包含字母。 – adrianbanks 2010-07-22 12:03:33

+0

是否有这个系统正在工作? – 2010-07-22 12:41:25

回答

0

虽然我怀疑这是与组设置有关,但我没有深入了解导致FileNotFoundException的原因 - 组中有本地和域用户。

因为我只需要用户的名字和SID,并且这些已经出现在DirectoryEntry上,所以我通过不调用RefreshCache方法解决了这个问题。这让代码执行时没有例外。

2

在Win32 API中,文件未找到的错误通常用作“资源未找到”错误。所以,它返回了诸如缺少注册表项的东西,或者 - 在这种情况下 - ADSI节点。

我绝对不是ADSI专家,但您对DirectoryEntry构造函数的第一个调用似乎使用无效路径样式according to MSDN。我相信你在机器名称之前需要域名。

更新:

another MSDN page注意到了这一点:“的GetInfo不能用于包含成员都在WINNT范围内众所周知的安全主体团体”

鉴于堆栈跟踪,似乎这可能导致问题。

+0

该计算机是域的一部分,但我正在查询本地组信息(尽管本地组可能包含域项)。我认为在这种情况下我不需要域名。 – adrianbanks 2010-07-22 12:06:01

+0

在这种情况下,我会尝试'WinNT:// '路径,而不指定'computer'类型。 – 2010-07-22 12:43:18

+0

我用新鲜的眼睛看着它。看看答案更新(这实际上是一个完全不同的答案),并看看是否有帮助。 – 2010-07-22 12:49:50

相关问题