我有一个用VB6编写的旧遗留程序(EXE1),它不需要管理员权限即可运行。所以这个程序的清单包含行
<requestedExecutionLevel level="asInvoker" />
告诉程序使用主叫用户(通常没有管理员)的权限运行。
对于一项新功能,我需要执行一些需要管理员权限的功能,但由于并非所有用户都会使用此新功能,因此如果真正调用此功能,程序应仅询问管理员凭据(UAC)。
我该怎么做?
我想,将此功能外包给带有
清单的第二个可执行文件(EXE2)<requestedExecutionLevel level="requireAdministrator" />
从EXE1调用这个可执行文件就可以了,但我错了。
运行EXE2独立会导致通常的UAC对话框,您可以在其中输入管理员凭据,程序将按预期工作。
1。使用VB6 Shell
命令
如果EXE1没有管理员权限,则调用EXE2不会弹出UAC对话框,而是导致运行时错误5(程序调用或参数无效)。
如果EXE1具有管理员权限,则EXE2可以正常工作。
2。使用WinApi命令ShellExecuteA
(lpOperation
参数设置为runas
)从EXE1中调用EXE2
如果EXE1没有运行管理员权限,则EXE2不会弹出UAC对话框,而是似乎工作并返回ERROR的退出代码。
如果EXE1具有管理员权限,则EXE2可以正常工作。
那么,如果EXE1没有管理员权限,如何在运行EXE2时弹出UAC对话框?
如果没有将该功能外包给独立的可执行文件(EXE2),我也很高兴听到这个。
谢谢。
答案 0 :(得分:0)
我们使用VB6 EXE1完成了这项工作,外包给独立的可执行文件EXE2。
我们按照this webpage中的方法调用ShellExecute
API调用,传递runas
动词以触发第二个可执行文件作为管理员运行。它工作正常。请注意,我们不对任何可执行文件使用清单。
像这样的东西
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
lRet = ShellExecute(0, "runas", "C:\somewhere\EXE2.exe", _
vbNullString, vbNullString, SW_SHOWNORMAL)