Этот запрос 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-разрядного поставщика должны быть возвращенным.