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 без прав администратора, которое не печатает вывод в отдельное окно?

1 ответ1

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 чтобы вернуться к приглашению.

В противном случае простыми \ надежными методами будет передача выходных данных через именованные каналы или через сокеты TCP \ IP.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .