Удаленное удаление только определенного процесса командной строки с помощью 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