windows - Indsend input til CMD, ved hjælp af CMD proces id (PID) i powershell

Indlæg af Hanne Mølgaard Plasc

Problem



Takket være Abbas giver følgende kode os mulighed for at kalde en cmd-proces og sende kommandoen til den ved hjælp af PowerShell-script.


$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


Nu, Hvordan kan jeg bruge en CMD-proces, der allerede eksisterer.


I bedre ord vil jeg bruge PID af en cmd.exe-proces, der kører og bestå kommandoen til den.

Bedste reference


Baseret på @Falkons kommentar:



  Jeg vil gerne være sikker på, at CMD'en kører som SYSTEM



Jeg synes, at koden skal fungere, som kontrollerer, at en kommando skal køre som SYSTEM. Den returnerer true for hver matchende shell, der kører som SYSTEM, med 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'
  }
}


Ovenstående kode skal køre i en forhøjet skal


Koden baseret på denne artikel kontrollerer, at kommandoprompten bliver forhøjet: [6]


$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} } }


Koden ovenfor skal køre i en ikke-forhøjet PowerShell-forekomst . Det tester for fraværet af en sti & håndtere - som den ikke forhøjede skal ikke kan se for en forhøjet kommandoprompt. Skift tilstanden eq 'TEST' for at matche dit vindue.