【问题标题】:Visual Basic Program - Ask for Admin PermissionsVisual Basic 程序 - 请求管理员权限
【发布时间】:2026-01-07 23:55:02
【问题描述】:

我正在尝试用 Visual Basic 编写安装程序,我希望安装程序尝试获得管理员权限。如果该帐户是管理员,我希望它只是假设他们,如果该帐户没有管理员权限,我希望显示这样的提示。

如果用户可以授予权限,那么它将继续使用它们,如果它不能授予它们,那么它将采用替代的无管理员权限路线,就像 Google Chrome 安装程序一样。我该怎么做呢?经过一个小时的研究,我在 Google 上没有发现任何有用的信息。

【问题讨论】:

  • “如果帐户是管理员,我希望它只是假设他们”我认为这是不可能的。系统会一直显示UAC提示;不同之处在于标准用户包括对凭据的请求,如您的屏幕截图所示,而管理员则不包括。此外,没有选项说“允许程序运行,但没有提升”,因此很难看到您的第二个要求也可以满足。我对使用“不可能”这个词犹豫不决,但 MSFT 在很大程度上依赖于 UAC 的坚不可摧
  • @peterG 我不在乎是否显示 UAC 提示。我的问题用词错误,因为我在我的计算机上关闭了 UAC,所以当程序需要管理员权限时,它只需要它们。

标签: vb.net admin uac


【解决方案1】:

在 Visual Studio 中,向您的项目添加一个新文件,选择“应用程序清单”作为文件类型,然后单击确定。

您将获得一个 XML 文档。文档的第一大块是这样的:

 <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
            If you want to change the Windows User Account Control level replace the 
            requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            Specifying requestedExecutionLevel node will disable file and registry virtualization.
            If you want to utilize File and Registry Virtualization for backward 
            compatibility then delete the requestedExecutionLevel node.
        -->
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />

取消注释以下内容的行:

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

这将使该应用程序(或 DLL)运行 UAC 以获得管理员权限。

如果您只希望特定组件运行提升,则将该代码放在单独的 DLL 文件中。当您的主程序第一次调用该程序集时,将出现 UAC,并授予提升权限。

【讨论】:

  • 很好 - 我假设 OP 已经知道如何将 exe 标记为 requireAdmin,但事实可能并非如此。此外,要访问清单,您只需单击项目资源管理器的“应用程序”选项卡上的“查看 Windows 设置”按钮。
  • @peterG 我不知道如何更改requireAdmin 的东西,而且我也不知道如何将单独的 DLL 文件默认设置为如果用户忽略 UAC 提示。
  • @DavidB 好的,那么也许我太仓促地假设您的问题是关于什么的。也许您可以对其进行编辑以包含更多关于“安装程序”的确切含义以及使用 VS 部署项目(VS2012/3 中的 ISLE)或 ClickOnce 等无法完成的操作。同时,设置 RequestedExecutionLevel根据 Nathan M 的回答,在清单中是如何控制 exe 在运行时是否生成 UAC 提示; ClickOnce 和 Google Chrome 安装程序通过安装到用户的配置文件而不是程序文件来避免在安装时对管理员的要求。
  • @NathanM 就是这样:我不知道该怎么做。至于点赞,我到现在才给你。
  • 创建具有两个不同权限范围的两个不同 DLL...在您的项目中引用它们。如果第一个失败,要么在 try 块中测试异常,要么做一些非常规的事情,比如如果必须的话,用注册表开关告诉自己程序的状态。无论如何,使用另一个程序集作为后备......只需在项目中引用这两个 DLL。
【解决方案2】:

评论空间用完了。 . . 解决此类安装程序的一个好方法是使用一组三个程序:加载程序、安装程序和主程序。 Loader 是从桌面快捷方式等驱动的。它的任务是检查供应商的 web api 等以查看是否有新版本可用。如果没有,则启动主程序。但是,如果有可用的新版本,则它为用户提供了下载它的机会。如果用户同意,则加载程序启动安装程序。安装程序是三个标记为 RequireAdmin 的唯一一个,因此 UAC 提示仅在必要时出现。安装程序下载并安装新版本,必要时卸载或覆盖旧版本。我们已经做了类似的事情并且效果很好。 但是,MS ClickOnce 也可以很好地工作,并且编码更少,而且更容易正确使用,我建议您也考虑这个选项。

编辑:但是,一些搜索使我找到了this MSFT link - 这可能会有所帮助。我自己没有尝试过这种技术。

【讨论】:

    最近更新 更多