【问题标题】:VB6: Run elevated program from not elevated programVB6:从未提升的程序运行提升的程序
【发布时间】: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),我也很高兴听到这个消息。

谢谢。

【问题讨论】:

    标签: vb6 uac


    【解决方案1】:

    我们使用 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)
    

    【讨论】:

    • 这正是我尝试过的,但 EXE2 没有显示 UAC 对话框。 EXE2 确实运行了,但显然没有管理员权限,因为它不能做它应该做的事情。
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2015-07-16
    • 1970-01-01
    • 2018-01-20
    • 2011-10-07
    相关资源
    最近更新 更多