2014-12-27 7 views
2

Я пытаюсь получить PCoIP статистики, которые доступны через WMI, я использую следующую команду для WMICWMI: Получение Ошибка Invalid класса при выполнении команды оболочки через другую программу

wmic path Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics 

или с помощью PowerShell

powershell Get-WmiObject -namespace "root\cimv2" -computername computer01 -class Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics 

Однако, когда я попытался запустить любую команду, разветвленную через другой процесс, в этом случае это был python, а piping stdout, я получаю ошибку Invalid class, как показано ниже.

Get-WmiObject : Invalid class 
At line:1 char:14 
+ Get-WmiObject <<< -namespace root\cimv2 -computername computer01 -class 
Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics 
    + CategoryInfo   : InvalidOperation: (:) [Get-WmiObject], ManagementException 
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand 

, если это поможет, то выход из Powershell команды через командную строку является

__GENUS     : 2 
__CLASS     : Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkS 
          tatistics 
__SUPERCLASS    : Win32_PerfRawData 
__DYNASTY     : CIM_StatisticalInformation 
__RELPATH     : Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkS 
          tatistics.Name="PCoIP Session" 
__PROPERTY_COUNT   : 19 
__DERIVATION    : {Win32_PerfRawData, Win32_Perf, CIM_StatisticalInfo 
          rmation} 
__SERVER     : DEMO-VSGA-WS01 
__NAMESPACE    : rootcimv2 
__PATH     : \DEMO-VSGA-WS01rootcimv2:Win32_PerfRawData_Terad 
          iciPerf_PCoIPSessionNetworkStatistics.Name="PCoIP S 
          ession" 
Caption     : 
Description    : 
Frequency_Object   : 0 
Frequency_PerfTime  : 10000000 
Frequency_Sys100NS  : 10000000 
Name      : PCoIP Session 
RoundTripLatencyms  : 284 
RXBWkbitPersec   : 22034 
RXBWPeakkbitPersec  : 4 
RXPacketLossPercent  : 112 
RXPacketLossPercent_Base : 28805 
Timestamp_Object   : 0 
Timestamp_PerfTime  : 299873128867 
Timestamp_Sys100NS  : 130641888164850000 
TXBWActiveLimitkbitPersec : 1832 
TXBWkbitPersec   : 75615 
TXBWLimitkbitPersec  : 90000 
TXPacketLossPercent  : 7 
TXPacketLossPercent_Base : 30942 

Я также попытался с помощью модуля питона WMI

hostname = os.getenv('COMPUTERNAME', '') 
c = wmi.WMI (hostname, namespace="root\\cimv2") 
print c.Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics 

Я получаю следующее сообщение об ошибке

print c.Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics 
    File "c:\users\ramesh~1\appdata\local\temp\easy_install-tlfipc\WMI-1.4.9-py2.7 
-win32.egg.tmp\wmi.py", line 1147, in __getattr__ 
    File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 522, in 
__getattr__ 
    raise AttributeError("%s.%s" % (self._username_, attr)) 
AttributeError: winmgmts://computer01/root/cimv2.Win32_PerfRawData_TeradiciP 
erf_PCoIPSessionNetworkStatistics 

Can это связано с уровнем олицетворения и аутентификации вызывающего?

UPDATE

Я переместил команду Powershell в файл летучей мыши, когда я запускаю файл битой через CMD, он снова работает нормально.

Когда вы просматриваете python, он показывает ту же ошибку. Если это помогает, я использую код python.

p = subprocess.Popen ('bat.bat',stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
print p.stdout.read() 

Я попробовал список классов в пространстве имен, класс был указан, когда файл летучей мыши вызывается через CMD, когда Popen, ни один из классов Teradici в не был доступны. Командная строка в bat.bat является

powershell Get-WmiObject -namespace "root\cimv2" -computername computer01 -list 

Все это выполняется на VMWare VDI (Virtual Desktop Infrastructure), могут ли быть какие-либо ограничения политики?

+0

Это, кажется, указывает на проблему синтаксического анализа: -namespace rootcimv2 – mjolinor

+0

@mjolinor Я не знал о escape-символе, я изменил программу, но все же, Invalid class – user1064504

+0

Любая вероятность того, что поставщик WMI зарегистрирован только в 32-битном или 64-битном, а не другом? Запустите 32-разрядную и 64-разрядную PowerShell и запустите 'Get-WmiObject -List Win32_PerfRawData_Teradici *'. –

ответ

1

После устранения неполадок в какой-то момент, по всей видимости, требуемый класс не был доступен из 32-битных программ, хотя, когда я пробовал через PowerShell (x64 & x86), я получил правильные ответы.

В противном случае 64 бита WMI Provider может быть доступна через 32 битную программу или наоборот, при правильной настройке __ProviderArchitecture & __RequiredArchitecture WMI Context флагов,

вещий пример выглядит следующим образом

import win32com.client 
import wmi 
import os 

objCtx = win32com.client.Dispatch("WbemScripting.SWbemNamedValueSet") 
if self.is64Windows(): 
    objCtx.Add ("__ProviderArchitecture", 64) 
else: 
    objCtx.Add ("__ProviderArchitecture", 32) 
objCtx.Add ("__RequiredArchitecture", True) 
server = wmi.connect_server (server = "localhost", namespace="root\\cimv2", named_value_set=objCtx) 
connection = wmi.WMI (wmi = server) 

Дополнительной информация о знаках контекста можно найти на msdn

Кроме того, для отладки WMI и устранения неполадок вы можете обратиться к