WMI飘忽/枚举用户帐户

问题描述:

我正在使用WMI来枚举计算机的用户,但对于某些客户,我收到了神秘的异常和/或代码无法正常工作。对于一个客户没有用户帐户信息从这个简单的代码返回: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 - USUARIOS”等

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代码的这些问题? 我怎样才能获得更多有关错误的信息?

+0

你真的需要提取一个方法或2.有时候,这是所有需要揭示一个错误。 – ChaosPandion 2010-09-21 19:55:35

几乎所有的WMI问题我遇到过,当它在一个客户端上工作,但不是另一个煮沸到操作系统和服务包级别。

多年来,MS对WMI对象进行了大量修复/更改/添加。我们有一台拥有17,000台机器的客户,我们安装了一项监控WMI信息的服务。机器运行从XP RTM到Windows 7的色域。

这是一场噩梦。可用WMI信息级别的差异令人惊叹。例如,取决于修补程序级别,仅获取CPU类型就已命中或未命中。

我会说,第1步是让客户机修补到该操作系统可用的最新Service Pack。然后再试一次。