如何让PS2EXE生成的.exe在所有电脑上强制以管理员权限运行
解决PS2EXE生成的EXE强制要求管理员权限的问题
方法一:编译时嵌入管理员权限清单
PS2EXE支持通过参数直接将权限清单嵌入生成的EXE,这是最可靠的方式:
- 创建
admin.manifest文件,内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly>
- 执行PS2EXE编译命令时添加
-manifest参数:
.\ps2exe.ps1 -inputFile YourBitLockerPINScript.ps1 -outputFile BitLockerPINChanger.exe -noConsole -manifest .\admin.manifest
生成的EXE会内置权限要求,启动时直接触发UAC弹窗,无需依赖外部清单文件。
方法二:给已生成的EXE嵌入清单
如果已经完成编译,可使用Windows SDK中的mt.exe工具修改现有EXE:
- 确保
mt.exe可用(通常位于C:\Program Files (x86)\Windows Kits\10\bin\<SDK版本>\<架构>目录,可将其加入系统PATH) - 执行以下命令:
mt.exe -manifest admin.manifest -outputresource:BitLockerPINChanger.exe;#1
此命令会将清单嵌入EXE资源中,替换原有默认清单。
方法三:在PowerShell脚本中添加权限检查逻辑
如果无法重新编译,可在脚本开头加入自动提权代码,确保运行时拥有管理员权限:
# 检查当前进程是否拥有管理员权限 $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { # 以管理员权限重新启动当前程序 Start-Process -FilePath $MyInvocation.MyCommand.Definition -Verb RunAs exit } # 后续的BitLocker PIN修改逻辑...
脚本转成EXE后,启动时若未获取管理员权限,会自动弹出UAC提示并重新启动带权限的实例。
为什么同目录清单无效?
PS2EXE生成的EXE默认会内置一个基础清单,优先级高于同目录下的同名外部清单(如BitLockerPINChanger.exe.manifest),因此单独放置外部清单不会生效,必须将清单嵌入EXE内部。
内容的提问来源于stack exchange,提问作者ProprietaryCloudGaming
相关产品推荐
相关产品推荐

