查找用户信息时抛出了意外的异常

时间:2010-07-22 10:20:04

标签: c# exception active-directory active-directory-group

我有一些代码正在查找计算机上本地组的组成员身份。对于每个成员,它会尝试加载有关用户的一些信息(例如,查找一个组并获取其每个成员的名称)。

代码:

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 个答案:

答案 0 :(得分:2)

文件未找到错误通常在Win32 API中用作“未找到资源”错误。因此,它会丢失注册表项,或者 - 在这种情况下 - 返回ADSI节点。

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

<强>更新

another MSDN page上注意到这一点:“GetInfo不能用于包含WinNT范围内已知安全主体成员的组。”

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

答案 1 :(得分:0)

我没有找到导致FileNotFoundException的问题的底部,虽然我怀疑它与群组设置有关 - 群组中同时包含本地和域用户。

因为我只需要用户的姓名和SID,并且DirectoryEntry已经存在这些,我通过不调用RefreshCache方法解决了这个问题。这使得代码可以无异常地执行。