【问题标题】:WMI Flakiness / Enumerating User AccountsWMI 脆弱性/枚举用户帐户
【发布时间】: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 个方法。有时这就是揭示错误所需要的全部内容。

标签: c# .net wmi


【解决方案1】:

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

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

那是一场噩梦。可用的 WMI 信息水平的差异令人震惊。例如,仅获取 CPU 类型是否命中取决于补丁级别。

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

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 2014-05-10
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多