【发布时间】:2010-09-22 03:58:32
【问题描述】:
我正在使用 WMI 来枚举计算机的用户,但对于某些客户,我遇到了神秘的异常和/或代码无法按预期工作。对于一个客户,此简单代码不会返回任何用户帐户信息:
SelectQuery query = new SelectQuery("Win32_UserAccount", string.Format("Domain='{0}'", Environment.MachineName));
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject mObject in searcher.Get()) {
Console.WriteLine((string)mObject["Name"]);
}
但对于同一个客户,我可以使用此代码枚举组,该代码会产生“Administradores”、“Convidados”、“分布式 COM - Usuários”等输出。
SelectQuery query = new SelectQuery("Win32_Group", string.Format("Domain='{0}'", Environment.MachineName));
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject mObject in searcher.Get()) {
Console.WriteLine((string)mObject["Name"]);
}
尝试使用以下代码枚举特定组中的用户会产生异常。我将 Environment.MachineName 作为域名和有效的组名传入。
public static void GetUsersInGroup(string domainName, string groupName) {
string findUsersQueryText = string.Format("GroupComponent=\"Win32_Group.Domain='{0}',Name='{1}'\"", domainName, groupName);
SelectQuery query = new SelectQuery("Win32_GroupUser", findUsersQueryText);
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) {
foreach (ManagementObject foundObject in searcher.Get()) {
foreach (var property in foundObject.Properties) {
if (property.Name == "PartComponent") {
ManagementPath managementPath = new ManagementPath(foundObject["PartComponent"].ToString());
if (managementPath.ClassName == "Win32_UserAccount") {
using (ManagementObject userAccount = new ManagementObject(managementPath)) {
foreach (var x in userAccount.Properties) {
//Exception raised here while trying to enumerate properties
//System.Management.ManagementException: Not found
// em System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
// em System.Management.ManagementObject.Initialize(Boolean getObject)
// em System.Management.ManagementBaseObject.get_Properties()
// em WmiTest.AccountManager.GetUsersInGroup(String domainName, String groupName)
Console.WriteLine(String.Format(" Name: '{0}' Value: '{1}'\r\n", x.Name ?? "null", x.Value ?? "null"));
}
}
}
}
}
}
}
}
我们已尝试删除 WMI 存储库,但问题仍然存在。
WMI 代码出现这些问题的原因是什么? 如何获得有关问题所在的更多信息?
【问题讨论】:
-
你真的需要提取一个或 2 个方法。有时这就是揭示错误所需要的全部内容。