首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WMI:通过另一个程序运行shell命令时出现无效的类错误

WMI:通过另一个程序运行shell命令时出现无效的类错误
EN

Stack Overflow用户
提问于 2014-12-27 17:02:04
回答 1查看 8.3K关注 0票数 4

我试图获得通过WMI提供的PCoIP统计数据,我使用下面的命令对WMI进行统计。

代码语言:javascript
复制
 wmic path Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics

或者使用powershell

代码语言:javascript
复制
powershell Get-WmiObject -namespace "root\cimv2" -computername computer01 -class Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics

但是,当我试图通过另一个进程运行任何一个命令分叉时,在本例中是python,并将stdout进行管道处理,我将得到如下所示的无效类错误。

代码语言:javascript
复制
 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命令通过命令提示符的输出是

代码语言:javascript
复制
__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。

代码语言:javascript
复制
hostname = os.getenv('COMPUTERNAME', '')
c = wmi.WMI (hostname, namespace="root\\cimv2")
print c.Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics

我收到了跟随错误

代码语言:javascript
复制
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

这是否与调用方的模拟和身份验证级别有关?

更新

我将powershell命令移动到bat文件,当我通过CMD运行bat文件时,它再次正常工作。

当Popen通过python时,它会显示相同的错误。如果有帮助的话,我正在使用python代码。

代码语言:javascript
复制
p = subprocess.Popen ('bat.bat',stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print p.stdout.read()

我试着在名称空间下列出类,当通过CMD调用bat文件时,类被列出,当Popen时,Teradici的任何类都不可用。bat.bat中的命令行是

代码语言:javascript
复制
powershell Get-WmiObject -namespace "root\cimv2" -computername computer01 -list

所有这些都是在虚拟桌面基础设施(,VMWare VDI )上运行的,是否存在任何策略限制?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-31 14:37:04

经过一段时间的故障排除后,原因似乎是,所需的类无法从32位程序中访问,尽管当我尝试通过PowerShell (x64 & x86)时,得到了正确的响应。

否则,通过正确设置__ProviderArchitecture__RequiredArchitecture WMI上下文标志,可以通过32位程序访问64位WMI提供程序,反之亦然。

化脓性例子如下所示

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27669447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档