只是好奇:
当我在我的Powershell脚本中想要安装或更新一个模块或执行另一个要求提升权限的命令时,我可以在我的未提升的Powershell窗口中使用:
powershell -ExecutionPolicy Bypass -Command "Start-Process Powershell -runAs -Wait -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File `"path\to\file`" $harguments'"
字符串
这将打开一个新的提升的窗口,我可以运行任何文件,具有提升的权限。
我只是想知道,我是否可以通过任何方式执行一个命令,要求从我的非提升提示符提升特权(以便不打开另一个窗口-只是接受“提升提示符”的要求)?
1条答案
按热度按时间8nuwlpux1#
出于安全性考虑,Windows本身禁止非提升进程和提升进程共享控制台。因此,从非提升进程启动的提升(控制台-子系统)进程 * 总是 * 在 * 新的 * 控制台窗口中运行。
只有**次优的,非平凡的 * 解决方法 * 需要一个 * 助手可执行文件 * 来 Package 提升的进程。
有关所涉及的权衡,请参见底部部分。
**
gsudo.exe
**就是这样一个helper可执行文件,您可以通过winget.exe
安装,具体如下:字符串
虽然
gsudo
同样适用于cmd.exe
甚至WSL,但它对来自PowerShell的调用提供了**特殊支持 *:gsudo
* 实际上 * 支持与PowerShell CLI相同的语法(powershell.exe
用于Windows PowerShell,pwsh
用于PowerShell(Core)7+),带有(仅)(隐含)-Command
参数。gsudo pwsh -NoProfile { net sessions }
.ps1
文件路径和参数:型
-Command
是在后台使用的,因此传递参数,即使在调用方作为 * 逐字 * 字符串传递时,也会受到被调用方 * 的解释 *;例如,gsudo C:\path\to\file.ps1 '$HOME'
仍然扩展为$HOME
变量的值,即在提升的过程中;您可以通过-File
而不是-Command
(例如gsudo pwsh -File C:\path\to\file.ps1 '$HOME'
)进行 explicit CLI调用来避免此问题,或者再次使用下面讨论的脚本块方法。{ ... }
),在这种情况下,您可以获得 * 丰富类型支持 * 的好处,尽管 * 有限的类型保真度 *,就像涉及 * 跨进程序列化 * 的情况一样。型
.ps1
调用具有丰富类型支持的等价物是(另外,防止了传递给-Args
的传递参数数组的元素的重新解释):型
在变通方法中,有两种相互排斥的方法,每种方法都有自己的优点和缺点-
gsudo
根据情况使用其中一种方法:gsudo
在启动时使用这种方法 * 不带参数 *,以便进入一个 * 交互式 * 提升的会话。gsudo
在您使用命令 * 启动gsudo
时使用此方法。[1]这与PowerShell remoting和后台jobs中使用的基于CLIXML的序列化类型相同。
字体保真度限制在this answer中有详细说明。