我正在尝试获取可通过WMI获得的PCoIP统计信息,我为WMIC使用以下命令
wmic path Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics
或与电源外壳
powershell Get-WmiObject -namespace "rootcimv2" -computername computer01 -class Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics
但是,当我尝试运行通过另一个进程分叉的任一命令时,在这种情况下是python,并且通过管道传输stdout,我收到无效的类错误,如下所示。
Get-WmiObject : Invalid class
At line:1 char:14
+ Get-WmiObject <<< -namespace rootcimv2 -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
我也尝试使用python模块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:usersramesh~1appdatalocaltempeasy_install-tlfipcWMI-1.4.9-py2.7
-win32.egg.tmpwmi.py", line 1147, in __getattr__
File "C:Python27libsite-packageswin32comclientdynamic.py", line 522, in
__getattr__
raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: winmgmts://computer01/root/cimv2.Win32_PerfRawData_TeradiciP
erf_PCoIPSessionNetworkStatistics
这是否与调用方的模拟和身份验证级别有关?
更新
我将powershell命令移动到蝙蝠文件,当我通过CMD运行蝙蝠文件时,它再次工作正常。
当Popen通过python时,它显示相同的错误。如果它有帮助,我正在使用python代码。
p = subprocess.Popen ('bat.bat',stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print p.stdout.read()
我尝试在命名空间下列出类,当通过 CMD 调用 bat 文件时列出了该类,当 Popen 时,Teradici 的类都不可用。bat.bat 中的命令行是
powershell Get-WmiObject -namespace "rootcimv2" -computername computer01 -list
所有这些都在VMWare VDI(虚拟桌面基础架构)上运行,是否有任何策略限制?
经过一段时间的故障排除,原因似乎是无法从 32 位程序访问所需的类,尽管当我尝试通过 PowerShell(x64 和 x86)时,我得到了正确的响应。
否则,可以通过 32 位程序访问 64 位 WMI 提供程序,反之亦然,通过正确设置 __ProviderArchitecture
和 __RequiredArchitecture
WMI 上下文标志,
一个 pythonic 示例如下
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
- http://msdn.microsoft.com/en-us/library/aa393067%28v=vs.85%29.aspx
- http://msdn.microsoft.com/en-us/library/aa390789%28v=vs.85%29.aspx
此外,有关 WMI 调试和故障排除,您可以参考
- http://msdn.microsoft.com/en-us/library/aa394603%28v=vs.85%29.aspx
- http://msdn.microsoft.com/en-us/library/aa392285%28v=vs.85%29.aspx