Чи надруковано вихід цього сценарію «sudo» у те саме вікно Powershell?


1

Я знайшов цей сценарій "sudo" в Інтернеті:

function Elevate-Process
{
    $file, [string]$arguments = $args;
    if([System.IO.File]::Exists("$(get-location)\$file"))
    {
    $file = "$(Get-Location)\$file";
    }
    $psi = new-object System.Diagnostics.ProcessStartInfo $file;
    $psi.Arguments = $arguments;
    $psi.Verb = "runas";
    [System.Diagnostics.Process]::Start($psi);
}

set-alias sudo Elevate-Process;

Це добре працює, але проблема полягає в тому, що якщо ви використовуєте його з програмами, які не мають графічного інтерфейсу, він породжує процес в іншому підвищеному вікні.

Наприклад, якщо я запускаю sudo sfc /scannow, вихід буде знаходитися у новому вікні, коли старе вікно дасть мені наступний вихід:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       2      280         76 ...55     0.00   7964 sfc

Чи можливо, щоб результат команди запускався із "sudo" відображався в непідвищеному вікні Powershell? Якщо ні, то чи є інший спосіб підняти вікно Powershell без адміністратора, яке не друкує вихід у окреме вікно?

Відповіді:


0

Що ви шукаєте - це спосіб перенаправити вихід іншого процесу на ваш окремий процес, тобто міжпроцесорне спілкування. Функція "sudo", яку ви використовуєте, лише починає процес з дієсловом "runas", який спонукає UAC до того, як він запустить окремий процес. Тут перелічено кілька рішень:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx

Вирішення, яке може бути достатньо, полягає в тому, щоб перенаправити строку вашої програми до текстового файлу та прочитати вихід.

function Elevate-Process
{
param(
$file, 
[string]$arguments = $args,
[string]$RedirectStandardOutput = 'C:\redirected.txt'
)
if([System.IO.File]::Exists("$(get-location)\$file"))
{
$file = "$(Get-Location)\$file";
}
$psi = new-object System.Diagnostics.ProcessStartInfo 'cmd.exe';
$psi.Arguments = "/c $file $arguments > $RedirectStandardOutput";
$psi.Verb = "runas";
$process = [System.Diagnostics.Process]::Start($psi);
get-content -path $RedirectStandardOutput -wait
}
set-alias sudo Elevate-Process;

запустіть програму, sudo sfc /cannow -RedirectStandardOutput C:\Wherever\Whatever.txt коли команда закінчила обробку, вам доведеться вибрати, ctrl + cщоб повернутися до підказки.

В іншому випадку найпростішими \ надійними методами буде передача виводу через Named Pipes або через TCP \ IP Sockets.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.