首页 > 解决方案 > 以管理员身份运行 DLL

问题描述

我尝试在管理上下文中执行单个 DLL 以强制用户在调用方法时输入 UAC,以防他被验证为普通用户。

我在这里找到了建议:Visual Basic Program - Ask for Admin Permissions

我试图创建 Nathan M 建议的内容,但没有显示 UAC 控件。

这是我正在使用的代码:

主要应用:

Imports System
Imports System.Diagnostics.Eventing.Reader
Imports GetUninstallToken.UninstallToken

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim t As New GetToken
            t.Test()
        Catch ex As Exception
        End Try
    End Sub

我在项目中添加了一个简单的 DLL 文件,只是为了获取身份验证对话框:

Namespace UninstallToken
    Public Class GetToken
        Public Sub Test()
            MsgBox("Test")
        End Sub
    End Class
End Namespace

我创建了一个清单文件,该文件应该适用于具有此配置的 DLL

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <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 element will disable file and registry virtualization. 
            Remove this element if your application requires this virtualization for backwards
            compatibility.
        -->
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

该项目如下所示:

在此处输入图像描述

因此,当我运行程序并单击按钮时,将调用 DLL 并显示 MsgBox 但没有 UAC - 我没有以管理员身份运行 VS。

任何想法我错过了什么?似乎清单文件可能会被忽略......

我在 Win 10 19H2 上使用 Microsoft Visual Studio Community 2019 版本 16.5.4 - 我以普通用户身份执行。

标签: vb.netadminmanifestuac

解决方案


这是我最终想到的:

  1. 我生成了一个包含请求的子功能的新 EXE

  2. 我添加了一个清单文件,将执行上下文设置为“requireAdministrator”

  3. 我使用以下代码在主应用程序中调用该 exe:

    Try
         Dim process As System.Diagnostics.Process = Nothing
         Dim processStartInfo As System.Diagnostics.ProcessStartInfo
         processStartInfo = New System.Diagnostics.ProcessStartInfo()
         processStartInfo.FileName = ".\MyApplication.exe"
         processStartInfo.Verb = "runas"
    
         processStartInfo.Arguments = ""
         processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
         processStartInfo.UseShellExecute = True
         process = System.Diagnostics.Process.Start(processStartInfo)
    
     Catch ex As Exception
         MsgBox("You need to be administrator to request this function")
     End Try
    

这样,我在调用函数时确实会收到 UAC 提示,如果没有,则会向用户显示错误消息。

可能不是最优雅的东西,但简单且有效;)


推荐阅读