感谢Abbas,以下代码使我们能够调用cmd进程并使用PowerShell脚本将命令传递给它。
$psi = New-Object System.Diagnostics.ProcessStartInfo;
$psi.FileName = "cmd.exe"; #process file
$psi.UseShellExecute = $false; #start the process from it's own executable file
$psi.RedirectStandardInput = $true; #enable the process to read from standard input
$p = [System.Diagnostics.Process]::Start($psi);
Start-Sleep -s 2 #wait 2 seconds so that the process can be up and running
$p.StandardInput.WriteLine("dir"); #StandardInput property of the Process is a .NET StreamWriter object
现在,我如何使用已存在的CMD流程。
更好的说法,我想使用正在运行的cmd.exe进程的PID并将命令传递给它。
答案 0 :(得分:0)
基于@Falcon的评论:
我想确保CMD以SYSTEM
的形式运行
我认为代码应该可以工作,它会检查作为SYSTEM运行的命令shell。对于以SYSTEM身份运行的每个匹配shell,它将返回true
,其中title = TEST:
Get-CimInstance Win32_Process -Filter "name = 'cmd.exe'" | ForEach-Object {
if ((Get-Process -Id $_.ProcessId).MainWindowTitle -eq 'TEST') {
(Invoke-CimMethod -InputObject $_ -MethodName GetOwner).User -eq 'SYSTEM'
}
}
以上代码需要在提升的shell中运行
基于this article的代码检查提升的命令提示符:
$p = Get-Process -Name cmd | where {$_.MainWindowTitle -eq 'TEST'} |
Select Name, @{Name="Elevated"; Expression={ if ($this.Name -notin @('Idle','System')) {-not $this.Path -and -not $this.Handle} } }
上面的代码需要在非提升的PowerShell实例中运行。它正在测试没有路径和路径。 handle - 非提升的shell无法查看提升的命令提示符。更改eq 'TEST'
条件以匹配您的窗口。