【发布时间】:2017-07-13 23:04:18
【问题描述】:
我有一个用 VB6 编写的旧遗留程序 (EXE1),它不需要管理员权限即可运行。所以这个程序的清单包含这一行
<requestedExecutionLevel level="asInvoker" />
告诉程序以调用用户的权限运行(通常在没有管理员的情况下)。
对于一项新功能,我需要做一些需要管理员权限的操作,但由于并非所有用户都会使用此新功能,因此如果确实调用了此功能,程序应该只要求提供管理员凭据 (UAC)。
我该怎么做?
我认为,将此功能外包给带有清单的第二个可执行文件 (EXE2)
<requestedExecutionLevel level="requireAdministrator" />
从 EXE1 调用这个可执行文件就可以了,但我错了。
独立运行 EXE2 会出现通常的 UAC 对话框,您可以在其中输入管理员凭据,程序按预期运行。
1.使用 VB6 Shell 命令从 EXE1 中调用 EXE2
如果 EXE1 没有管理员权限,调用 EXE2 不会弹出 UAC 对话框,而是会导致运行时错误 5(无效的过程调用或参数)。
如果 EXE1 具有管理员权限,则 EXE2 可以工作。
2.使用 WinApi 命令 ShellExecuteA 从 EXE1 中调用 EXE2(将 lpOperation 参数设置为 runas)
如果 EXE1 没有管理员权限,则运行 EXE2 不会弹出 UAC 对话框,而是似乎可以工作并返回 ERROR 的退出代码。
如果 EXE1 具有管理员权限,则 EXE2 可以工作。
那么,如果 EXE1 没有管理员权限,如何在运行 EXE2 时弹出 UAC 对话框?
如果有办法不将功能外包给独立的可执行文件 (EXE2),我也很高兴听到这个消息。
谢谢。
【问题讨论】: