我在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”,其行为与我手动以“以管理员身份运行”启动它的方式完全相同?
答案 0 :(得分:0)
我现在可以想到两个选项(可能稍后会有更多选项):
如果您可以使用中间工具:
使用psexec
正在运行:
system("C:\\utils\\PsExec.exe -i -s -d cmd.exe");
打开打印的cmd
:
DISPLAY:
None.
SYSTEM:
None.
AWAYMODE:
None.
运行powercfg -requests
您可以使用OpenProcessToken
功能并从您最喜欢的进程中窃取一个令牌
以nt authority\system
(例如csrss.exe
或services.exe
)运行,然后您可以使用ImpersonateLoggedOnUser
或CreateProcessAsUser
。