TL; DR-唯一的选择是生成另一个进程。(一个新的cmd.exe
。)对于命令提示符,使用具有更高权限的访问令牌启动一个新实例将始终导致创建一个新窗口。
无法为已经运行的进程授予其他权限。
具有管理权限的用户登录到启用了用户帐户控制(UAC)的Windows计算机时,将创建两个单独的访问令牌:
- 具有完全管理员访问权限的一个,以及
- 具有标准用户访问权限的第二个“过滤令牌”
在CMD.EXE
创建流程(例如)时,会为其分配这两个访问令牌之一。如果该进程以管理员身份“提升”运行,则使用未过滤的访问令牌。如果未授予该进程管理员权限,则使用过滤后的标准用户令牌。
创建进程后,将无法替换其访问令牌。1在此“ 用于Windows桌面的 MSDN 应用程序安全性” 线程中,张贴者将自己标识为Windows内核团队的成员,指出:
一旦进程开始运行,NT内核就永远不会允许令牌交换。这是因为可能已在旧的安全上下文中打开了句柄等,运行中的操作可能会使用不一致的安全上下文等。因此,一旦开始执行进程,切换进程的令牌通常是没有意义的。但是,直到Vista才强制实施。[重点矿山](来源感谢到@BenÑ)
注意:Windows Vista发行版引入了用户帐户控制。
这个超级用户的答案引用了另外两个来源来证实这一点:
因此,根本不可能就地提升命令提示符或任何其他进程。唯一的选择是使用新的访问令牌生成另一个进程(如果需要,它可以是原始进程的另一个实例)。对于命令提示符,使用具有较高权限的访问令牌启动新实例将始终导致创建新窗口,并且如果在系统上启用了UAC提示,则也会触发它们。
1您可以使用AdjustTokenPrivileges函数调整现有访问令牌中的特权,但根据MSDN:
AdjustTokenPrivileges函数不能向访问令牌添加新的特权。它只能启用或禁用令牌的现有特权。