VB6:从未提升的程序

时间:2017-02-23 12:48:11

标签: vb6 uac

我有一个用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 lpOperation参数设置为runas)从EXE1中调用EXE2

如果EXE1没有运行管理员权限,则EXE2不会弹出UAC对话框,而是似乎工作并返回ERROR的退出代码。
如果EXE1具有管理员权限,则EXE2可以正常工作。

那么,如果EXE1没有管理员权限,如何在运行EXE2时弹出UAC对话框?

如果没有将该功能外包给独立的可执行文件(EXE2),我也很高兴听到这个。

谢谢。

1 个答案:

答案 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)