vb.net - 以管理员身份运行 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 - 我以普通用户身份执行。
解决方案
这是我最终想到的:
我生成了一个包含请求的子功能的新 EXE
我添加了一个清单文件,将执行上下文设置为“requireAdministrator”
我使用以下代码在主应用程序中调用该 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 提示,如果没有,则会向用户显示错误消息。
可能不是最优雅的东西,但简单且有效;)
推荐阅读
- python-3.x - 是否可以直接从内存中播放音频?
- python-3.x - shutil.copytree() 没有完成复制过程
- java - RSA加密:在android/java中加密,在python中解密(密码学)
- java - chromedriver:无法通过 Java 使用 ChromeDriver Selenium 执行二进制文件和 SEVERE 将会话 null 上的 newSession 转发到远程
- reactjs - 为什么 Reactjs 一次显示所有用户全名
- php - 有时 $_COOKIE[] 在设置 cookie 并且 cookie 出现在浏览器中后为空,但在两次三页重新加载后它工作得很好
- math - 将音频文件拆分为重叠的块
- c# - 同时插入2行数据到同一个模型项ASP.NET Core
- java - 如何验证正确的日期格式模式?格式化模式,而不是字符串中的日期
- swift - 类型“ChatViewController”不符合协议“MessagesDataSource”