WMI Flakiness / Перечисление учетных записей пользователей - PullRequest
1 голос
/ 21 сентября 2010

Я использую 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", "Distributed 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 Ответ

1 голос
/ 21 сентября 2010

Почти все проблемы с WMI, с которыми я столкнулся, когда он работает на одном клиенте, но не на другом, сводятся к уровню ОС и пакета обновления.

За многие годы MS внесла МНОГО исправлений / изменений / дополнений в объекты WMI. У нас есть один клиент с 17 000 компьютеров, на котором мы установили службу, которая отслеживает некоторую информацию WMI. Машины работают от XP RTM до Windows 7.

Это был кошмар. Различия в уровне доступной информации WMI были поразительными. Например, в зависимости от уровня патча, просто получить тип процессора ударил или пропустил.

Я бы сказал, что на шаге 1 клиентская машина исправлена ​​до последнего пакета обновления, доступного для этой ОС. Затем попробуйте снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...