gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:43:29 24 4
gpt4 key购买 nike

我正在尝试获取可通过 WMI 获得的 PCoIP 统计信息,我对 WMIC 使用以下命令

 wmic path Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics

或使用 powershell

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

但是,当我尝试运行通过另一个进程 fork 的任一命令时,在本例中它是 python,并通过管道传输 stdout,我收到如下所示的无效类错误。

 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

我还尝试使用 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:\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文件时,它再次正常工作。

当通过 python Popen 时,它显示相同的错误。如果有帮助,我正在使用 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 "root\cimv2" -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 上找到

另外WMI调试和故障排除可以引用

关于powershell - WMI:通过另一个程序运行 shell 命令时出现无效类错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27669447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com