我有一些代码正在查找计算机上本地组的组成员身份。对于每个成员,它会尝试加载有关用户的一些信息(例如,查找一个组并获取其每个成员的名称)。
代码:
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
(以及它要查找的文件)?
答案 0 :(得分:2)
文件未找到错误通常在Win32 API中用作“未找到资源”错误。因此,它会丢失注册表项,或者 - 在这种情况下 - 返回ADSI节点。
我绝对不是ADSI专家,但您对DirectoryEntry
构造函数的第一次调用似乎使用了无效的路径样式according to MSDN。我相信你在机器名称之前需要域名。
<强>更新强>
在another MSDN page上注意到这一点:“GetInfo不能用于包含WinNT范围内已知安全主体成员的组。”
鉴于堆栈跟踪,似乎这可能导致问题。
答案 1 :(得分:0)
我没有找到导致FileNotFoundException
的问题的底部,虽然我怀疑它与群组设置有关 - 群组中同时包含本地和域用户。
因为我只需要用户的姓名和SID,并且DirectoryEntry
已经存在这些,我通过不调用RefreshCache
方法解决了这个问题。这使得代码可以无异常地执行。