Назад | Перейти на главную страницу

Запрос WMI, выполняемый в консоли Powershell, дает меньше результатов в 32-битном режиме, чем в 64-битном режиме.

Этот запрос gwmi -Class Win32_PerfFormattedData_NETFramework_NETCLRMemory дает меньше результатов, если я запускаю его в 32-битной консоли PowerShell, чем в 64-битной. Похоже, что фоновые процессы, такие как службы, отображаются только в 64-битном формате. Это не уникально для PowerShell, я получаю одни и те же противоречивые результаты как на C #, так и на F #. У меня также возникает проблема с некоторыми инструментами мониторинга, которые я использую.

Что здесь происходит? Как мне заставить работать 32-битный режим правильно?

Принято JPBlancрешение от этот ответ на StackOverflow

# Setup the context information
$mContext = New-Object System.Management.ManagementNamedValueCollection
$mContext.Add( "__ProviderArchitecture", 64)
$mContext.Add( "__RequiredArchitecture", $true)

# Setup the Authrntification object
$ConOptions = New-Object System.Management.ConnectionOptions
#$ConOptions.Username = "computername\administrateur" # Should be used for remote access
#$ConOptions.Password = "toto"
$ConOptions.EnablePrivileges = $true
$ConOptions.Impersonation = "Impersonate"
$ConOptions.Authentication = "Default"
$ConOptions.Context = $mContext

# Setup the management scope (change with the computer name for remote access)
$mScope = New-Object System.Management.ManagementScope( `
                                "\\localhost\root\cimV2", $ConOptions)

$mScope.Connect()

# Query
$queryString = "SELECT * From Win32_PerfFormattedData_NETFramework_NETCLRMemory"
$oQuery = New-Object System.Management.ObjectQuery ($queryString)
$oSearcher = New-Object System.Management.ManagementObjectSearcher ($mScope, $oQuery)
$oResult = $oSearcher.Get();

$oResult.Name      # only for simple check that current code snippet gives 
                   # the same results from both 32 and 64 -bit version of PowerShell

Запрос данных WMI на 64-битной платформе

По умолчанию приложение или сценарий получает данные от соответствующего поставщика, если существуют две версии поставщиков. 32-разрядный поставщик возвращает данные в 32-разрядное приложение, включая все сценарии, а 64-разрядный поставщик возвращает данные в 64-разрядные скомпилированные приложения. Однако приложение или сценарий могут запрашивать данные у поставщика, отличного от стандартного, если он существует, уведомляя WMI с помощью флагов о вызовах методов.

Флаги контекста В __ProviderArchitecture и __RequiredArchitecture Строковые флаги имеют набор значений, обрабатываемых WMI, но не определенных в файлах заголовка SDK или библиотеки типов. Значения помещаются в параметр контекста, чтобы сигнализировать WMI, что он должен запрашивать данные у поставщика, отличного от заданного по умолчанию.
Ниже перечислены флаги и их возможные значения.

  • __ProviderArchitecture Целочисленное значение, 32 или 64, которое указывает 32-разрядную или 64-разрядную версию.
  • __RequiredArchitecture Логическое значение, используемое в дополнение к __ProviderArchitecture для принудительной загрузки указанной версии провайдера. Если версия недоступна, WMI возвращает ошибку 0x80041013, wbemErrProviderLoadFailure для Visual Basic и WBEM_E_PROVIDER_LOAD_FAILURE для C ++. Значение по умолчанию для этого флага, когда он не указан, - FALSE.

В 64-разрядной системе, которая имеет параллельные версии поставщика, 32-разрядное приложение или сценарий автоматически получает данные от 32-разрядного поставщика, если только эти флаги не указаны и не указывают, что данные 64-разрядного поставщика должны быть возвращенным.