WMI — недопустимый класс: Win32_InstalledWin32Program

У меня есть сценарий, который перебирает все рабочие станции из подразделения Active Directory и извлекает данные о программном обеспечении с каждой машины.

Я нашел два класса, которые дают мне эти данные:

Win32_Product
Win32_InstalledWin32Program

Последний список является более полным, поскольку, насколько я понимаю, Win32_Product отображает только приложения, установленные с помощью установщика Windows, хотя последний не включает свойство InstallDate. Наличие InstallDate менее важно, чем наличие полного списка, поэтому я объединил вывод двух моих команд GWMI и использовал Sort-Object -Property Name -Unique, чтобы приблизиться к тому, что я ищу. Изменить: узнал, что запросы Win32_Product инициирует проверку согласованности для каждого запрашиваемого программного обеспечения, что может привести к переустановке программы в случае обнаружения ошибок. Буду полностью исключать Win32_Product и благодарить все божественные силы за то, что я не переустановил какой-то критически важный производственный инструмент. https://support.microsoft.com/en-ca/help/974524/event-log-message-indicates-that-the-windows-installer-reconfigured-al

По какой-то причине класс Win32_InstalledWin32Program недоступен на некоторых компьютерах, и я получаю сообщение об ошибке Get-WMIObject : Invalid Class. После проверки с помощью Get-WMIObject на нескольких проблемных машинах я могу подтвердить, что нужный мне класс недоступен. Почему это может быть так, и есть ли способ сделать это доступным для меня? Я не могу найти в документации ничего о зависимости. Все машины работают под управлением Windows 7, см. снимок экрана ниже.

      $winProduct = GWMI Win32_Product -ComputerName $computer | Select-Object Name,Vendor,Version,InstallDate
      # vvv This fails on certain machines.
      $winPrograms = GWMI Win32_InstalledWin32Program -ComputerName $computer| Select-Object Name, Vendor, Version, InstallDate
      $winProduct + $winPrograms | Sort-Object -Property Name -Unique | export-csv -path $targetSWfile -notype

Сравнение ProgramQuery Сравнение OSQuery


person ssoong    schedule 20.06.2018    source источник
comment
Добрый день! Есть подозрение на повреждение wmi на этой машине. Рекомендую восстановить wmi.   -  person Justicet    schedule 20.06.2018
comment
Могу ли я проверить это удаленно через powershell и как восстановить? Я понимаю, что восстановление WMI может иметь некоторые негативные последствия. Я новичок в PS, поэтому мне не слишком комфортно играть методом проб и ошибок на этом уровне, так как я перебираю около 1000 машин, и у многих есть эта проблема. Любое руководство приветствуется   -  person ssoong    schedule 20.06.2018
comment
Нет, негативных последствий после восстановления wmi не наблюдал. очень часто я делаю это в своем офисе. часто на машинах приходится восстанавливать wmi и переустанавливать sccm   -  person Justicet    schedule 20.06.2018
comment
Моя группа поддержки обслуживается очень и очень многими 1000 машинами. Команды восстановления wmi легко найти в интернете (сейчас нет под рукой, т.к. пишу с телефона). Для этого используем bat-файл.   -  person Justicet    schedule 20.06.2018
comment
Добрый день! Сейчас я нахожусь в своем кабинете, поэтому привожу код восстановления wmi. Поскольку он содержит много символов, я даю его как отдельный ответ   -  person Justicet    schedule 21.06.2018


Ответы (2)


Этот код восстановления wmi, выполнение от администратора или системной учетной записи:

net stop winmgmt
cd %windir%\system32\wbem
if exist Repos_backup rd Repos_backup /s /q
rename Repository Repos_backup
net start winmgmt
winmgmt /resetrepository
winmgmt /salvagerepository
winmgmt /resyncperf
regsvr32 /s %systemroot%\System32\scecli.dll
regsvr32 /s %systemroot%\System32\userenv.dll
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.dll') do regsvr32 /s %%s
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.exe') do regsvr32 /s %%s
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.mfl') do mofcomp %%s
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.mof') do mofcomp %%s
wmiprvse /regserver
cd %windir%
if exist CCM rd CCM /s /q
if exist ccmcache rd ccmcache /s /q
if exist ccmsetup rd ccmsetup /s /q
if exist SMS*.INI del SMS*.INI /s /q
if exist SMS*.mif del SMS*.mif /s /q
cd %windir%\System32
if exist CCM rd CCM /s /q
if exist ccmcache rd ccmcache /s /q
if exist ccmsetup rd ccmsetup /s /q 
person Justicet    schedule 21.06.2018

Класс Win32_InstalledWin32Program предоставляется файлом aeinv.mof. Этот файл мог быть поврежден или отсутствовать.

Репозиторий WMI находится здесь: C:\Windows\System32\wbem

Один из способов решить эту проблему — скопировать файл с устройства, на котором класс работает нормально, и перезаписать файл в репозитории wmi проблемного устройства. Впоследствии вам потребуется перезапустить службу WinMgmt.

Дополнительные сведения см. в определении класса здесь: https://msdn.microsoft.com/en-us/library/dn894026(v=vs.85).aspx

В корпоративной среде это было бы относительно неприемлемо, и можно было бы предположить, что у вас также есть SCCM для сбора данных инвентаризации. На предприятии было бы более целесообразно отказаться от выполнения задач, ориентированных на одноранговые сети, и выполнять задачи, управляемые сервером управления, например программу из SCCM или какого-либо другого центра администрирования. То, как вы подходите к этому в масштабе предприятия, зависит от того, какую проблему вы на самом деле пытаетесь решить.

Существуют и другие механизмы для получения инвентаризации программного обеспечения, и я хотел бы изучить их вместо того, чтобы пытаться выполнять запросы с помощью классов Win32_Product или Win32_InstalledWin32Program, поскольку они интенсивны и полагаются на то, что клиент находится в сети во время выполнения.

person Adam Parsons    schedule 21.06.2018
comment
Крайне плохой совет перезаписывать файл в папке Windows, и для этого потребуются права администратора. Это также приведет к запуску любого приличного антивирусного программного обеспечения и (по крайней мере, в моем офисе) приведет к административным действиям и возможному прекращению. - person Ken White; 21.06.2018
comment
Возник вопрос: почему это может быть так, и есть ли способ сделать это доступным для меня? - person Adam Parsons; 21.06.2018
comment
И ваш ответ: заменить файл в дереве папок Windows, отключив все антивирусное программное обеспечение на планете, что я объяснил в своем предыдущем комментарии. Плохой ответ - плохой ответ. Хотя это может сработать, это плохая идея, и ее следует избегать. Отрежьте себе пальцы. Это исправит ситуацию. это плохое решение проблемы У меня слишком длинные ногти, даже если это сработает. - person Ken White; 21.06.2018
comment
Отрезать себе руку, когда ваши ногти слишком длинные, — это аналогия, подходящая для описания восстановления всего репозитория WMI, когда у вас есть проблема только с одним файлом. Это не рекомендация для продвижения вперед, это явный ответ на заданный вопрос. Если бы это был я, я бы вообще не использовал этот класс WMI. - person Adam Parsons; 21.06.2018
comment
К сведению: это не запустит все антивирусное программное обеспечение на планете. Постарайтесь быть немного менее истеричным в своих отзывах. - person Adam Parsons; 21.06.2018
comment
Ты прав. Не все антивирусное программное обеспечение на планете. Только те, которые реально работают. Существует множество неработающих антивирусных программных продуктов (т. е. ненастоящих антивирусных программ), которые позволили бы этому скользить. Они также позволяют всевозможным вредоносным программам проникать в вашу систему. Попробуйте использовать немного здравого смысла. Каждое фактически работающее антивирусное программное обеспечение на планете будет иметь проблемы с этим решением. Я был вежлив и не голосовал за ваш ответ. Я просто передумал. - person Ken White; 21.06.2018
comment
Спасибо за ваше внимание и время, я обновил свой ответ. - person Adam Parsons; 21.06.2018
comment
Цените все понимание. Проблема, которую я пытаюсь решить, заключается в том, что зонд SCCM не может быть установлен на всех рабочих станциях домена. На нашем предприятии есть два отдельных дерева ISA, одно из которых управляется ИТ-отделом, а другое — операционным отделом. Однако машины OT находятся вне нашей юрисдикции, и нас заваливают запросами на обслуживание этих устаревших активов, поскольку люди из операционной группы не понимают разницы и плохо подготовлены для самостоятельного оказания поддержки. - person ssoong; 21.06.2018
comment
Компания запросила решение для анализа данных для просмотра инвентаризации корпоративного оборудования и программного обеспечения; в частности, для сравнения активов ИТ и ОТ, чтобы оценить потребность в специалисте на месте для обслуживания этих активов или для передачи их под юрисдикцию ИТ. Некоторые из этих ресурсов OT полностью запрещены, поэтому мне как администратору домена было поручено придумать удаленный неинвазивный запрос для сбора этих данных. Чтобы получить непротиворечивые данные, мне пришлось полностью отказаться от SCCM. Если у вас есть альтернативное решение моей проблемы, определенно буду признателен за руководство. - person ssoong; 21.06.2018
comment
Предполагая, что они находятся в одном и том же домене, вы можете рассмотреть возможность добавления коллекции в SCCM, особенно для этой демографической группы, которая находится вне вашей юрисдикции. Затем к этой коллекции потребуются примененные к ней клиентские настройки, которые удалят все действия, связанные с развертыванием, и выполнят только сбор инвентаризации. Таким образом, данные могут быть агрегированы и использованы через SCCM, но устройства останутся нетронутыми SCCM. Это звучит как правдоподобное решение? Для этого потребуется установить агент, но убедиться, что они получили совершенно другой набор политик (для пользователей и компьютеров). - person Adam Parsons; 21.06.2018
comment
Это можно было бы сделать, если бы они также находились в другом домене с соответствующими доверительными отношениями. Это можно сделать неинвазивно, кроме той части, где устанавливается агент :) - person Adam Parsons; 21.06.2018
comment
Это была моя первоначальная мысль, но, к сожалению, нет, агент не может быть установлен. Некоторые из этих машин предназначены для одной конкретной задачи, так как они работают круглосуточно и без выходных, отображая производственные показатели и имеют решающее значение для бизнеса. Этим машинам тоже приближается, если не перегоняет, 10 лет, отсюда и вопрос, как с ними быть. SCCM, конечно, был бы самым чистым вариантом, но я надеюсь, что не единственным. - person ssoong; 21.06.2018
comment
Для устройств, работающих круглосуточно и без выходных, вы можете сделать прямой запрос, если это единственный подходящий способ, помимо использования готовых инструментов (SCCM). Существуют функции, которые вы можете использовать, чтобы избежать использования этих двух классов WMI, например, путем очистки ключей реестра. Посмотрите, как вы можете запрашивать установки приложений Win32 без использования WMI. Затем для тех, кто не работает 24/7, вам действительно нужны отношения агент-сервер, если вы хотите 100% покрытие, или вы можете пытаться запрашивать автономные устройства в течение нескольких недель. Лично я бы настаивал на агенте КМ... Не завидую вашему затруднительному положению! - person Adam Parsons; 21.06.2018
comment
Вот пример отказа от использования классов WMI: blogs.technet.microsoft.com/heyscriptingguy/2011/11/13/ - person Adam Parsons; 21.06.2018
comment
Обязательно прочитайте комментарии! Там больше действительно хорошей информации. - person Adam Parsons; 21.06.2018