WMI Flakiness /枚举用户帐户

时间:2010-09-21 19:54:21

标签: c# .net 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 - 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代码可能导致这些问题? 如何获得有关出错的更多信息?

1 个答案:

答案 0 :(得分:1)

我遇到的几乎所有WMI问题都是在一个客户端上运行但不是另一个问题归结为操作系统和服务包级别。

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

那是一场噩梦。可用的WMI信息水平差异令人震惊。例如,根据补丁级别,只是获取或未命中CPU类型。

我想说第1步是将客户端计算机修补到该操作系统可用的最新Service Pack。然后再试一次。