我在网上找到了这个“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;
它运行良好,但问题是,如果您将它与没有 GUI 的应用程序一起使用,它会在不同的提升窗口中生成该进程。
例如,如果我运行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
是否可以在非提升的 Powershell 窗口中显示使用“sudo”运行的命令的输出?如果不能,是否有其他方法可以提升非管理员 Powershell 窗口,而不会将输出打印到单独的窗口?
答案1
您正在寻找一种将另一个进程的输出重定向到您的单独进程的方法,即进程间通信。您使用的“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 套接字传递输出。