Ошибка WMI Scripting Windows 8

У меня проблема с WMI на машине с Windows 8 Home Edition. Мне нужно поймать использование ЦП и ProcessID процессом. Я пробовал так много способов:

  • ShellExecute в Delphi
  • *.bat с кодом
  • *.vbs
  • *.vbs, выполненный *.bat
  • A *.ps1
  • *.ps1, выполненный *.bat

(Возможно, некоторые из этих способов могут быть действительно глупыми, но я все равно пробовал)

В User-Click это работает отлично, но в автономном режиме это не работает. Я открыл безопасность на WMIMGMT.msi некоторых папок, и политика выполнения (в PowerShell) теперь НЕОГРАНИЧЕНА.

Это код в файле *.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 : Invalid query "select * from Win32_Win32_PerfFormattedData_PerfProc_Process"
In C:\Somefolder\PP.ps1:4 character: 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
    } 
    
  • *.летучая мышь

    powershell -executionPolicy unrestricted -file "C:\MonitorPerformance\test.ps1" > C:\MonitorPerformance\output1.txt
    
  • Вывод: (Consulta inválida = Invalid Query; No = in; caractere = character)

    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
    

person Nick G.    schedule 07.01.2016    source источник
comment
Можете ли вы запрашивать другие вещи с помощью WMI?   -  person Matt    schedule 07.01.2016
comment
Сообщение об ошибке в вашем вопросе было вызвано недопустимым именем класса (Win32_Win32_PerfFormattedData_PerfProc_Process), которое вы исправили. Вы все еще получаете сообщение об ошибке?   -  person Ansgar Wiechers    schedule 07.01.2016
comment
Я не тестировал другой класс с WMI. Если вы можете сказать мне код для тестирования, я буду благодарен И объяснить, что код на машине с Win8 был правильным, но я написал неправильный код здесь   -  person Nick G.    schedule 07.01.2016
comment
Да, у меня все еще есть ошибка   -  person Nick G.    schedule 07.01.2016
comment
Я получил новость, что я изменил $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) foreach ($p in $peflist) { "" + $p.IDProcess + ";" + $p.PercentProcessTime } на: get-wmiobject Win32_OperatingSystem (просто тест), и это работает! Я до сих пор понятия не имею, что происходит...   -  person Nick G.    schedule 07.01.2016
comment
Очевидно, что вы не можете получить сообщение об ошибке из сценария, в котором вы запускаете get-wmiobject Win32_PerfFormattedData_PerfProc_Process. Пожалуйста, отредактируйте свой вопрос и опубликуйте точный код и сообщение об ошибке. Скопируйте и вставьте его. Не перефразируйте. Не печатайте по памяти.   -  person Ansgar Wiechers    schedule 08.01.2016
comment
Хорошо, я приложу усилия (эта машина с Win8 находится на сервере в другом штате из моей страны) (и язык pt-br, поэтому я переведу еще раз)   -  person Nick G.    schedule 08.01.2016
comment
@AnsgarWiechers, вот и все   -  person Nick G.    schedule 08.01.2016
comment
Можете ли вы запустить wbemtest, подключить и перечислить экземпляры этого класса? Также попробуйте запустить WMIDiag. .   -  person Ansgar Wiechers    schedule 08.01.2016
comment
Я вижу это с помощью wbemtest , у меня есть идея сделать фиктивную программу x64 для выполнения *.bat и... ЭТО НЕВЕРОЯТНО РАБОТАЕТ! Я до сих пор так понимаю разозлился с Win8... Спасибо за помощь   -  person Nick G.    schedule 09.01.2016


Ответы (2)


заменить это:

$perflist = (get-wmiobject Win32_Win32_PerfFormattedData_PerfProc_Process)

с этим:

$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
person Anthony Stringer    schedule 07.01.2016
comment
Спасибо за помощь, чувак, но я неправильно написал здесь свой код (копирую с другой машины) - person Nick G.; 07.01.2016
comment
@НикГ. Затем вам нужно изменить свой вопрос, так как ошибка указала, что это проблема. Вы все еще получаете неверный запрос? - person Matt; 07.01.2016
comment
@Matt Я не понял вашей помощи, ошибка не заключается в удалении Win32 из Win32_Win32_PerfFormattedData_PerfProc_Process, а заключается в том, что Windows 8 не позволяет автономным приложениям использовать WMI. - person Nick G.; 07.01.2016

Windows 8 не выполняет действия WMI идеально, когда вы используете x32-приложения, я сделал фиктивное x64-приложение, которое выполняет *.bat, и оно, наконец, работает. Спасибо за помощь.

person Nick G.    schedule 08.01.2016