VB6:从非提升程序运行提升程序

VB6:从非提升程序运行提升程序,vb6,uac,Vb6,Uac,我有一个用VB6编写的旧遗留程序(EXE1),它不需要管理员权限即可运行。所以这个程序的清单包含了 <requestedExecutionLevel level="asInvoker" /> 告诉程序以调用用户的权限运行(通常不使用admin) 对于一个新功能,我需要做一些需要管理员权限的事情,但是因为不是所有用户都会使用这个新功能,所以如果真的调用了这个功能,程序应该只要求管理员凭据(UAC) 我该怎么做 我认为,将此功能外包给第二个可执行文件(EXE2),其中包含 <

我有一个用VB6编写的旧遗留程序(EXE1),它不需要管理员权限即可运行。所以这个程序的清单包含了

<requestedExecutionLevel level="asInvoker" />

告诉程序以调用用户的权限运行(通常不使用admin)

对于一个新功能,我需要做一些需要管理员权限的事情,但是因为不是所有用户都会使用这个新功能,所以如果真的调用了这个功能,程序应该只要求管理员凭据(UAC)

我该怎么做

我认为,将此功能外包给第二个可执行文件(EXE2),其中包含

<requestedExecutionLevel level="requireAdministrator" />

从EXE1调用这个可执行文件就可以了,但我错了

运行EXE2 standalone会产生一个常见的UAC对话框,您可以在其中键入管理员凭据,程序会按预期工作

一,。使用VB6
Shell
命令从EXE1中调用EXE2

如果EXE1没有管理员权限,调用EXE2不会弹出UAC对话框,而是会导致运行时错误5(过程调用或参数无效)。
如果EXE1拥有管理员权限,则EXE2可以工作

二,。使用WinApi命令
ShellExecuteA
(将
lpOperation
参数设置为
runas
)从EXE1中调用EXE2

如果EXE1没有管理员权限,那么运行EXE2不会弹出UAC对话框,相反,它似乎可以工作并返回错误的退出代码。
如果EXE1拥有管理员权限,则EXE2可以工作

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

如果有一种方法不将该特性外包给独立的可执行文件(EXE2),我也很高兴听到这个消息


谢谢。

我们已经用VB6 EXE1完成了这项工作,它外包给了一个独立的可执行EXE2

我们遵循中的方法,调用
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)

这正是我所尝试的,但是EXE2没有显示UAC对话框。EXE2确实运行了,但显然没有管理员权限,因为它不能做它应该做的事情。