WMI 脚本 Windows 8 错误

Posted

技术标签:

【中文标题】WMI 脚本 Windows 8 错误【英文标题】:WMI Scripting Windows 8 error 【发布时间】:2016-01-07 18:43:58 【问题描述】:

我在装有 Windows 8 家庭版的机器上遇到了 WMI 问题。我需要按进程捕获 CPU 使用率和 ProcessID。我尝试了很多方法:

Delphi 中的 ShellExecute 带有代码的 *.bat 一个 *.vbs 由 *.bat 执行的 *.vbs 一个 *.ps1 由 *.bat 执行的 *.ps1

(也许其中一些方法真的很愚蠢,但我还是尝试过)

在用户点击中它完美地工作,但通过独立申请它不起作用。 我已经打开了一些文件夹的 WMIMGMT.msi 上的安全性,现在执行策略(在 PowerShell 中)是 UNRESTRICTED。

这是 *.ps1 文件中的代码:

$ErrorActionPreference = "SilentlyContinue"
Stop-Transcript | Out-Null
$ErrorActionPreference = "Continue"
$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
foreach ($p in $peflist) 
  "" + $p.IDProcess + ";" + $p.PercentProcessTime

这是 *.bat 上的代码

powershell -ExcetutionPolicy Unrestricted -File "C:\Somefolder\PP.ps1" > C:\SomeFolder\output.txt

我得到的只是这个输出:

get-wmiobject:无效查询“从 Win32_Win32_PerfFormattedData_PerfProc_Process 中选择 *”
在 C:\Somefolder\PP.ps1:4 字符:14
+ $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     + CategoryInfo : InvalidArgument: (:) [Get-WmiObject], ManagementException
     + FullyQualifiedErroID : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Edit1:按要求复制的代码:

*.ps1:

$ErrorActionPreference="SilentlyContinue" 
Stop-Transcript | out-null 
$ErrorActionPreference = "Continue"
$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) 
foreach ($p in $perflist) 
  "" + $p.IDProcess + ";" + $p.PercentProcessorTime
 

*.bat

powershell -executionPolicy unrestricted -file "C:\MonitorPerformance\test.ps1" > C:\MonitorPerformance\output1.txt

输出:(Consulta inválida = 无效查询;否 = in;caractere = 字符)

get-wmiobject : Consulta inv lida "select * from Win32_PerfFormattedData_PerfProc_Process"
No C:\MonitorPerformance\test.ps1:4 caractere:14
+ $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

【问题讨论】:

你能用 WMI 查询其他东西吗? 您问题中的错误消息是由无效的类名 (Win32_Win32_PerfFormattedData_PerfProc_Process) 引起的,您已更正。您仍然收到错误消息吗? 我没有用 WMI 测试过另一个类。如果你能告诉我一个代码来测试,我将不胜感激并解释一下,win8机器上的代码是正确的,但我这里的代码写错了 是的,我仍然有错误 我得到消息,我将$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) foreach ($p in $peflist) "" + $p.IDProcess + ";" + $p.PercentProcessTime 更改为:get-wmiobject Win32_OperatingSystem(只是一个测试)并且它有效!我仍然不知道发生了什么...... 【参考方案1】:

替换这个:

$perflist = (get-wmiobject Win32_Win32_PerfFormattedData_PerfProc_Process)

用这个:

$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)

【讨论】:

谢谢你的帮助,伙计,我在这里写错了我的代码(我是从另一台机器上复制的) @NickG。然后您需要更改您的问题,因为错误表明这是问题所在。您仍然收到无效的查询吗? @Matt 我不明白你的帮助,错误不在于从“Win32_Win32_PerfFormattedData_PerfProc_Process”中删除“Win32”,但它在于 Windows 8 不允许独立应用程序使用 WMI。 【参考方案2】:

当您使用 x32 应用程序时,Windows 8 无法完美执行 WMI 操作,我制作了一个虚拟 x64 应用程序,它执行 *.bat 并且它终于可以工作了。感谢所有帮助。

【讨论】:

以上是关于WMI 脚本 Windows 8 错误的主要内容,如果未能解决你的问题,请参考以下文章

python写的用WMI检测windows系统信息的脚本

SCOM 监视器的 WMI 访问被拒绝错误

Windows Server 2008 中的 WMI 错误(WMI 提供程序)

深入挖掘Windows脚本技术

Shell与Wmi获取windows性能

C# - Windows 服务 - 远程 WMI 查询抛出错误:找不到 RPC