Удаленное удаление только определенного процесса командной строки с помощью PowerShell

Я пытаюсь написать скрипт для удаленного уничтожения определенного процесса командной строки. Если я запускаю get-process локально, я вижу, что процесс CMD.exe можно сузить с помощью значения, указанного в поле "MainWindowTitle".

Если я получаю имя Get-Process -computer или получаю CIMInstance, поле "MainTitleWindow" возвращается пустым.

$ses = New-CimSession -ComputerName $computer -Credential $cred
$process = Get-CimInstance -ClassName CIM_process -CimSession $ses -filter "name = 'cmd.exe'"
$process | Select-Object name,MainWindowTitle
Remove-CimSession -CimSession $ses


name    MainWindowTitle
----    ---------------
cmd.exe

3 ответа

Извлечено из MSDN:

Процесс имеет главное окно, связанное с ним, только если процесс имеет графический интерфейс. Если связанный процесс не имеет главного окна (так что MainWindowHandle равен нулю), MainWindowTitle является пустой строкой ("").

Больше информации здесь.

Я пытался сравнить с другими процессами, но результат тот же...

$Process = Get-CimInstance CIM_Process -CimSession $Ses | Where-Object{ $ProcessNames -contains $_.Name }

используя это, вы также можете получить ProcessID и ParentProcessID. затем вы можете использовать аналогичные команды, чтобы затем найти процесс CMD, который использует ParentProcessID вашего основного сценария. Вы должны закрыть как основной процесс скрипта, так и командную строку, иначе скрипт продолжит работу.

Вы могли бы разобрать вывод tasklist команда. Как это:

$cmds = tasklist /v |
    Where-Object {$_ -like "cmd.exe*"} |
    ForEach-Object {
        New-Object -TypeName PSObject -Prop @{"ID"=[int]$_.Substring(30,5); `
                                              "Title"=$_.Substring(157)}
    }

$cmds

Другие вопросы по тегам