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(以及它正在寻找什么文件)?

4

2 回答 2

2

未找到文件错误在 Win32 API 中通常用作“未找到资源”错误。因此,它会因缺少注册表项或 - 在本例中 - ADSI 节点等情况而返回。

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

更新:

在另一个 MSDN 页面上注意到这一点:“GetInfo 不能用于包含 WinNT 范围内众所周知的安全主体的成员的组。”

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

于 2010-07-22T11:02:53.547 回答
0

FileNotFoundException尽管我怀疑这与组设置有关,但我没有深入了解导致.

因为我只需要用户名和 SID,而且这些已经存在于 上DirectoryEntry,所以我通过不调用该RefreshCache方法解决了这个问题。这使代码可以毫无例外地执行。

于 2010-08-18T22:57:48.797 回答