代码之家  ›  专栏  ›  技术社区  ›  adrianbanks

查找用户信息时引发意外异常

  •  1
  • adrianbanks  · 技术社区  · 15 年前

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

    代码:

    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)
    

    是什么导致了 文件未找到异常 (它在找什么文件)?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Stephen Cleary    15 年前

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

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

    更新:

    注意到这一点 another MSDN page :“GetInfo不能用于包含Winnt作用域中已知安全主体的成员的组。”

    考虑到堆栈跟踪,这似乎是导致问题的原因。

        2
  •  0
  •   adrianbanks    15 年前

    我没搞清楚是什么导致了 FileNotFoundException 尽管我怀疑这与组的设置有关,但组中既有本地用户,也有域用户。

    因为我只需要用户名和sid,这些已经存在于 DirectoryEntry ,我通过不调用 RefreshCache 方法。这使得代码可以毫无例外地执行。