使用powershell中的CMD进程ID(PID)将输入传递给CMD

时间:2017-01-31 14:07:45

标签: windows powershell cmd

感谢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并将命令传递给它。

1 个答案:

答案 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'条件以匹配您的窗口。