在 *nix 系统上,你可以像这样获取 root shell:
$ su # or 'sudo -s'
#
根 shell 在同一终端内生成。
我正在尝试寻找可以在 Windows 命令提示符上执行类似就地提升的程序。换句话说,它不应生成新窗口或显示 UAC 提示。到目前为止,我已经能够创建绕过 UAC 的计划任务,但提升的命令提示符窗口并未就地生成。
Windows 中是否有类似的命令可以执行就地提升而不生成新窗口?
答案1
总结- 唯一的选择是生成另一个进程。(一个新的cmd.exe
。)在命令提示符的情况下,使用具有更高权限的访问令牌启动新实例总是会导致出现一个新窗口正在创建。
无法向已经运行过程。
当具有管理权限的用户登录启用了用户帐户控制 (UAC) 的 Windows 计算机时,创建两个单独的访问令牌:
- 一名具有完全管理员访问权限的人,以及
- 具有标准用户访问权限的第二个“过滤令牌”
当时一个过程(例如CMD.EXE
) is created, it is assigned one of these two 访问令牌。如果进程以管理员身份“提升”运行,则使用未过滤的访问令牌。如果进程未被授予管理员权限,则使用已过滤的标准用户令牌。
一旦创建了进程,就无法替换其访问令牌。1 In this MSDN Windows 桌面应用程序安全 线一位自称是 Windows 内核团队成员的发帖人表示:
NT 内核从未打算允许在进程开始运行后进行令牌切换。这是因为句柄等可能已在旧的安全上下文中打开,正在进行的操作可能使用不一致的安全上下文等。因此,在进程开始执行后切换进程的令牌通常是没有意义的。然而,直到 Vista 才开始执行。[重点是我的](来源谢谢到@Ben N)
笔记:用户帐户控制随着 Windows Vista 的发布而引入。
此超级用户回答引用另外两个来源证实了这一点:
devzest.com 博客文章编程提升权限/UAC:
代码只能在启动时在进程级别提升,这意味着无法提升正在运行的进程。为了提升现有应用程序,必须创建该应用程序进程的新实例...
techtarget.com 文章如何使用 Vista 的 UAC 正确提升程序的权限:
程序一旦启动就无法提升......
因此,根本不可能提升命令提示符或任何其他进程的权限。唯一的选择是使用新的访问令牌生成另一个进程(如果需要,可以是原始进程的另一个实例)。在命令提示符的情况下,使用具有更高权限的访问令牌启动新实例将始终导致创建新窗口,并且如果系统上启用了 UAC 提示,它们也会被触发。
1You can adjust the privileges in an existing access token with the 调整Token权限功能,但是根据 MSDN:
AdjustTokenPrivileges 函数无法为访问令牌添加新的权限。它只能启用或禁用令牌的现有权限。
答案2
虽然我是 的热心用户TCC-LE
,但有一个不需要任何新程序的解决方案:-
- 以管理员身份启动
cmd
。 - 这应该可以让你从这里开始
%SystemRoot%\system32\
- 如果没有的cd
话。 copy cmd.exe cmdadmin.exe
(或您选择的任何名称,例如su.exe
)。- 现在运行资源管理器并查找
cmdadmin.exe
。 - 右键单击并选择特性。
- 在里面兼容性选项卡选择以管理员身份运行(或为所有用户设置)。
现在cmdadmin
是您的su
或sudo
:您可以不带参数启动它,以便为您提供具有管理权限的 shell,或者您可以使用它来运行它/c
以在此模式下执行单个命令。根据您的策略,您可能会或可能不会提示您确认。
请注意,这将始终打开一个新窗口(与 TCC 解决方案一样start /elevated ...
):对于 GUI 应用程序,这是预期的,但对于命令行程序,您可能希望使用/k
而不是/c
,以便您有机会看到输出;或者您可以通过批处理文件(sudo.cmd
也许?)运行,它连接& pause
到您的运行字符串的末尾。
su
不管哪种情况,它都与或不太一样sudo
,但它是最接近的。通过手动设置窗口布局,可以直接在原始窗口下方和相邻处创建新窗口。
答案3
是否有一个命令可以提升命令提示符的权限?
有一个比较不方便的方法:
powershell -Command "Start-Process 'cmd.exe' -Verb runAs"
有更好的方法,但微软关闭了它们。当然,您可以随时撸起袖子,用sudo
我刚刚给您的源代码编写自己的脚本。
换句话说,它不应该产生新窗口或显示 UAC 提示。
亵渎神明!把他烧死在火刑柱上!;)玩笑归玩笑,没有。没有。那将是一个错误和安全漏洞。微软明确努力确保提升和标准流程尽可能少有共同之处。
聪明的孩子正在考虑两个后端(一个标准,一个提升)和一个图形前端,应该阅读会话 0 隔离。
答案4
Windows 中是否有类似的命令可以执行就地提升而不生成新窗口?
没有内置这样的命令。虽然我还没有证明这一点,但我确实相信这一点,因为我已经看到多种使用额外软件/代码来解决这个问题的方法。
换句话说,它不应该产生新窗口或显示 UAC 提示。
忘掉它。绝对忘掉它。这违背了 UAC 的设计。如果你能做到这一点,你就破坏了一个基本的安全流程。在 Microsoft 了解并修复了你可能为解决这个问题而采取的任何流程后,你的解决方案可能会被补丁破坏。
避免 UAC 提示的解决方案是首先使用较高的高度。如果您有足够的权限,UAC 就不会打扰您。如果您从较低的高度开始(出于安全考虑,通常建议这样做),然后尝试执行需要较高高度的操作,那么就会出现 UAC 交互。