如何从提升的程序启动提升的控制台(cmd.exe),就像手动完成一样?

时间:2014-05-31 19:56:43

标签: c++ uac createprocess

我在Windows 7上安装了一个Visual C ++ x32应用程序,该应用程序在清单中将UAC执行级别设置为requireAdministrator。它启动一个控制台:

 system("C:\\windows\\system32\\cmd.exe");

但是这个控制台的行为不像是从上下文菜单中以“以管理员身份运行”开始的。

当我检查手动启动的“cmd.exe”报告的电源管理时,我注意到了一个区别:

C:\Windows\system32>powercfg -requests
DISPLAY:
None.

SYSTEM:
None.

AWAYMODE:
None.

以编程方式启动“cmd.exe”时将其报告为:

C:\Windows\System32>powercfg -requests
DISPLAY:
None.

SYSTEM:
[DRIVER] ?
[DRIVER] ?
[DRIVER] ?
[DRIVER] ?
[DRIVER] ?
[DRIVER] ?
[DRIVER] ?
[DRIVER] ?

AWAYMODE:
None.

我还尝试用“ShellExecuteEx”启动它,并将lpVerb设置为“runas”,但结果相同。

如何从升级过程以编程方式启动“cmd.exe”,其行为与我手动以“以管理员身份运行”启动它的方式完全相同?

1 个答案:

答案 0 :(得分:0)

我现在可以想到两个选项(可能稍后会有更多选项):

  1. 如果您可以使用中间工具:

    使用psexec正在运行:

    system("C:\\utils\\PsExec.exe -i -s -d cmd.exe");
    

    打开打印的cmd

    DISPLAY:
    None.
    
    SYSTEM:
    None.
    
    AWAYMODE:
    None.
    

    运行powercfg -requests

  2. 您可以使用OpenProcessToken功能并从您最喜欢的进程中窃取一个令牌

    nt authority\system(例如csrss.exeservices.exe)运行,然后您可以使用ImpersonateLoggedOnUserCreateProcessAsUser