是否有可以提升命令提示符的命令?


61

在* nix系统上,您可以像这样获得root shell:

$ su # or 'sudo -s'
#

根外壳在同一终端内生成。

我正在尝试找到在Windows命令提示符下执行类似的就地提升的功能。换句话说,它不应产生新窗口或显示UAC提示。到目前为止,我已经能够执行绕过UAC的计划任务,但是未生成高架命令提示符窗口。

Windows是否有类似的命令,它执行就地标高而不生成新窗口?


31
请注意,su / sudo -s实际上还会启动一个新的Shell进程。只是将提升的过程连接到同一终端,因此它们看起来就好像就地提升了一样。
Lie Ryan

“它不应产生新窗口或显示UAC提示”您是否只是在说它不需要图形交互?或者你不想被提示在所有?例如,sudo有时会提示您输入密码,但是会通过文本界面提示输入密码。我想知道Nano服务器(默认情况下甚至不提供用于远程桌面的GUI)如何处理它。
jpmc26

2
@ jpmc26在文本界面上的交互是可以的。
user2064000 '17

@ jpmc26我想知道Nano服务器是否甚至具有UAC。鉴于它已针对容器进行了优化,因此听起来并不是很有用。它还在服务器核心版本IIRC中被禁用。如果您不小心启用了它,则会遇到很多麻烦:)
Luaan

2
@ user2064000在安全桌面(而不是用户当前的桌面)上启动了UAC提示符(至少对于非Windows二进制文件是默认情况下)。除了有些烦人之外,这还旨在防止其他进程干扰UAC提示。另外,如果需要身份验证,则必须在安全桌面上,并且某些管理员可能还需要Ctrl-Alt-Del序列来证明Windows正在获取密码,而不是其他模拟密码提示的过程。因此,从Microsoft安全角度来看,在cmd窗口中键入密码可能不会生效。
Calchas

Answers:


65

TL; DR-唯一的选择是生成另一个进程。(一个新的cmd.exe。)对于命令提示符,使用具有更高权限的访问令牌启动一个新实例将始终导致创建一个新窗口


无法为已经运行的进程授予其他权限。

具有管理权限的用户登录到启用了用户帐户控制(UAC)的Windows计算机时,将创建两个单独的访问令牌

  1. 具有完全管理员访问权限的一个,以及
  2. 具有标准用户访问权限的第二个“过滤令牌”

CMD.EXE创建流程(例如)时,会为其分配这两个访问令牌之一。如果该进程以管理员身份“提升”运行,则使用未过滤的访问令牌。如果未授予该进程管理员权限,则使用过滤后的标准用户令牌。

创建进程后,将无法替换其访问令牌1在此“ 用于Windows桌面的 MSDN 应用程序安全性” 线程中,张贴者将自己标识为Windows内核团队的成员,指出:

一旦进程开始运行,NT内核就永远不会允许令牌交换。这是因为可能已在旧的安全上下文中打开了句柄等,运行中的操作可能会使用不一致的安全上下文等。因此,一旦开始执行进程,切换进程的令牌通常是没有意义的。但是,直到Vista才强制实施[重点矿山](来源感谢@BenÑ

注意:Windows Vista发行版引入了用户帐户控制。

这个超级用户的答案引用了另外两个来源来证实这一点:

因此,根本不可能就地提升命令提示符或任何其他进程。唯一的选择是使用新的访问令牌生成另一个进程(如果需要,它可以是原始进程的另一个实例)。对于命令提示符,使用具有较高权限的访问令牌启动新实例将始终导致创建新窗口,并且如果在系统上启用了UAC提示,则也会触发它们。


1您可以使用AdjustTokenPrivileges函数调整现有访问令牌中的特权,但根据MSDN

AdjustTokenPrivileges函数不能向访问令牌添加新的特权。它只能启用或禁用令牌的现有特权。


19

当我是的热情用户时TCC-LE,有一种解决方案不需要任何新程序:

  • cmd以管理员身份启动。
  • 这应该使您开始%SystemRoot%\system32\-如果没有,cd则在那里。
  • copy cmd.exe cmdadmin.exe(或您选择的任何名称,例如su.exe)。
  • 现在运行资源管理器并查找cmdadmin.exe
  • 右键单击并选择属性
  • 在“ 兼容性”选项卡中,选择“以管理员身份运行”(或为所有用户设置)。

现在cmdadmin是您的susudo:您可以不带参数启动它,从而为您提供具有管理特权的shell,或者您可以运行它以/c在此模式下执行单个命令。根据您的策略,系统可能会提示您确认,也可能不会提示您。

请注意,这将始终打开一个新窗口(与TCC解决方案一样start /elevated ...):对于GUI应用程序,这是预期的,但是对于命令行程序,您可能希望使用/k而不是/c,以使您有机会看到输出; 或者您可以通过一个批处理文件(sudo.cmd也许吗?)运行,该文件连接& pause到运行字符串的末尾。

无论哪种情况,它都不是susudo,但它是您将获得的最接近的值。通过手动设置窗口布局,可以在下面直接创建新窗口并邻接原始窗口。


这可能是OP能够最接近OP的行为sudo的警告,但仍需要处理新产生的新窗口/进程。从安全的角度来看,这可能不是最好的主意,但是禁用所有UAC提示将消除在提升过程启动时必须响应UAC提示的麻烦。
Twisty Impersonator'Apr 16'17

@Twisty-感谢您的评论。我知道安全隐患,但是这些隐患并不比该帐户允许以管理员身份运行的原始前提还差。实施此方法的任何人都可以决定调用该方法时,他还是她是否想要不断的提醒。
AFH

2
我没有提到对您有利的安全隐患,而是对其他读者。但是,我不同意禁用UAC提示并不比以管理员身份运行更糟糕。UAC提示可以阻止以Admin(管理员)身份登录的用户向进程授予不需要的管理权限。如果没有提示,用户将失去这个机会。
Twisty Impersonator'Apr 17'17

@Twisty-就是这样。我的回应来自类似动机。再次感谢。
AFH

1
而不是复制cmd.exe,而是创建一个符号链接。这样,如果Windows对其进行了更新并修复了安全漏洞,则您不会运行旧版本mklink cmdadmin.exe cmd.exe
Josef

11

是否有可以提升命令提示符的命令?

有一种相当不方便的方法:

powershell -Command "Start-Process 'cmd.exe' -Verb runAs"

有更好的方法,但是Microsoft关闭了它们。当然,您总是可以袖手旁观,并编写sudo与我刚刚给您的源代码等效的脚本。

换句话说,它不应产生新窗口或显示UAC提示。

亵渎!烧死他吧!;)开个玩笑,不。没有。那将是一个错误和一个安全漏洞。Microsoft做出了明确的努力,以确保提升过程和标准过程的共同点尽可能少。

聪明的孩子正在考虑两个后端(一个标准,一个高架)和一个图形化的前端,应该阅读Session 0 Isolation


2

Windows是否有类似的命令,它执行就地标高而不生成新窗口?

没有内置命令。尽管我还没有证明这一点,但我确实相信,因为我已经看到了使用额外软件/代码来解决此问题的多种方法。

换句话说,它不应产生新窗口或显示UAC提示。

算了吧。完全忘记它。这与UAC的设计背道而驰。如果您能解决这个问题,那么您将破坏一个基本的安全流程。在Microsoft了解并修复了解决此问题的任何过程之后,期望您的解决方案会被补丁破坏。

避免UAC提示的解决方案是从高处开始。如果您被充分授权,UAC不会打扰您。如果您从较低的海拔高度开始(通常出于安全考虑,通常建议这样做),然后尝试做一些需要较高海拔高度的操作,那么可以期望UAC进行交互。


UAC提示可能已被计划任务绕过;我正在寻找执行就地高程的东西,而不是生成新的命令提示符窗口。
user2064000 '17

如果这样做,是否可以真正设置计划任务而不满足UAC的要求?至于生成,我是说我没想到,因为我注意到到目前为止我看到的所有提升解决方案都涉及启动一个新过程。我认为可以完成技术升级而无需启动新过程,因为安装程序在启动后可能会要求提供UAC,但我不记得曾经见过任何易于使用的解决方案,它们都可以轻松导入批处理文件中。
TOOGAM

确实; 计划任务完全击败了UAC。提升后,您可以通过服务提升到SYSTEM,然后在原始cmd.exe进程上使用replace令牌。
约书亚

一些官方的PowerToy脚本可以完成基本工作。您可以键入elevate cmd以打开一个带有UAC提示符的新命令提示符窗口(该站点还具有上下文菜单命令!)。或者,当然,您可以仅按Ctrl + Shift +单击任何现有命令提示符窗口的任务栏图标来执行相同操作-这是我最常做的事情。(我知道这不是OP的要求,而是OP的要求受设计限制。)
Miral

2

您想要的在Windows中是不可能的,因为它不支持此概念。您需要以更高的权限启动新进程

我使用nircmd从命令行提升进程。您的命令将是nircmdc elevate cmd


2

我看到了这个问题,并提出了一个简单的解决方案。这是一个名为的微型实用程序rsudo,可以从常规CMD窗口运行升级的命令。

注意:出现UAC提示。隐藏这是不可能的,这只是UAC设计的方式。

Usage:
  rsudo.exe "[command]"

下载 [下载不起作用,将很快更新]

注意:这些命令在新窗口中运行。如果要查看输出,请运行rsudo.exe "pause && [command]"


不是rsudo.exe "[command] && pause"吗?

@fleet不,pause首先导致错误,然后运行
rahuldottech

拉胡尔,谢谢!有机会获得源代码吗?;)(或者也许我只是在您的网站上找错了位置。)
cxw

@cwz确定!我到家时会对其进行编辑,并添加博客文章:D
rahuldottech

0

这很奇怪。

您可以尝试在自己的计算机上使用ssh,该计算机将使用相同的现有终端,但实际上是完全不同的终端。

可以,但是可能不是您想要的。

其他人可能会发现它很有用。


-1

尝试使用JPSOFT Take Command命令提示符TCC / LE。它具有32位和64位版本,并且是免费的,除非您需要更多功能。

转到https://jpsoft.com/,然后单击“下载”,然后选择所需的内容。

TCC / LE有一个START / ELEVATED,它以完全的管理员特权启动提升的程序。(仅限Windows Vista或更高版本。)


1
这与问题有什么关系?
user2064000

@DavidGrainger原来,/ elevated开关仍然不允许我绕过UAC并进行就地仰角(有关详细信息,请参阅问题)。我想念什么吗?
user2064000 '17

这是Windows命令提示符的替代。另外,启动它与启动内置命令提示符没有什么不同。
Twisty Impersonator'Apr

唯一的方法可能是将UAC设置更改为“从不通知”。当UAC通知弹出时,单击“显示更多详细信息”链接,然后选择“显示何时应显示此通知”链接。选择有效的设置。您可能需要在完成后将其更改回原来的位置,以免发生不必要的操作。这可以在Windows设置中完成。
David Grainger

TCC / LE也做很多其他事情。我尝试将UAC设置为从不,然后使用“开始/ Elevated / PGM“ C:\ Program Files \ IrfanView \ i_view64.exe” / thumbs“打开“升高的程序”。
David Grainger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.