关于HM NISEDIT在新版系统下编译并运行提示权限不足问题的解决方案

时间:2022-09-30 12:10:13

 

如果你使用过NSIS为你的项目制作过安装包,那HM nisedit一定是你绕不过去的槛,作为NSIS号称的最佳免费IDE/编辑器,功能齐全,与NSIS配合性能强悍,实至名归。只是开发作者最后版本更新在2005年已经停止,国内汉化版修修补补也仅仅坚持到2006年未再继续,时至今日,已经过去十几年,与新版操作系统和新版NSIS(3.0X)出现了各种不兼容和BUG,其中最典型的莫过于在vnsiedit中编辑好脚本后使用“编译并运行”功能,会出现请求的操作需要提升,代码740系统警告并停止执行,

关于HM NISEDIT在新版系统下编译并运行提示权限不足问题的解决方案

经过分析,我个人认为这与新操作系统安全机制更新有直接关系,说到这里,又不得不提及windows的用户帐户控制(UAC)机制,从 Windows Vista开始,微软引入了额外的安全级别(UAC),要求在安装应用程序完成其他任务之前提示用户输入管理密码,以标准用户身份登录到 Windows Vista 的用户(Vista 的默认登录名)只能写入磁盘上的特定位置。在 Windows 7 及更高版本上,UAC 的侵入性比在 Vista 上要小的多。但这些安全机制的更改,仍然让HM VNSIEDIT这类开发应用于XP及更低系统的应用出现了各种不兼容。而当前新开发应用应对UAC控制的主要办法是为程序配置嵌入程序清单,注明执行级别!至于开发于小二十年前的VNSIEDIT,由于受当时开发环境所限,根本没有嵌入完善的程序清单,这是当前在使用中会出现需要提升权限的直接原因!

解决方案:

既然原因找到,那接下来就是解决问题了,没有程序清单,有两个解决方案,1.重新编译Vnsiedit,为其嵌入完善的程序清单。2.直接为现有的Vnsiedit配置外部清单。因为我们是在解决当前的使用bug,而不是为新系统重新改良Vnsiedit的整体兼容性,所以第二个方案就成了不二选择!

所谓程序清单,其实是一个XML文件,正常情况下会在程序或应用编译时被嵌入其中,当然,如果你不嫌弃业余或不优雅,外置清单也是可以使用的!具体到NSIS中,实战脚本如下:

#编写:水晶石
#给vnsiedit添加外部程序清单并强制优先使用
OutFile 'Nsismanifest.exe'

Section
GetTempFileName
$R0
FileOpen $1 $R0 "w"
  
#程序清单其实是一个XML文件,这里将内容按照标准格式写入临时文件后再去更名
   
FileWrite $1 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>$\r$\n'
   
FileWrite $1 '<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">$\r$\n'
   
FileWrite $1 '    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">$\r$\n'
   
FileWrite $1 '        <security>$\r$\n'
   
FileWrite $1 '            <requestedPrivileges>$\r$\n'
   
FileWrite $1 '                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>$\r$\n'
   
FileWrite $1 "            </requestedPrivileges>$\r$\n"
   
FileWrite $1 "        <security>$\r$\n"
   
FileWrite $1 "    </trustInfo>$\r$\n"
   
FileWrite $1 "</assembly>>$\r$\n"
   
FileClose $1
   
CopyFiles /SILENT $R0 "VNISEdit.exe.manifest"            ; 复制临时文件至目标文件位置并更名
   
Delete $R0
  
SetRegView 64   #注意系统重定向
  #关键一步,写入参数,强制程序优先使用程序外部清单
  WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide" "PreferExternalManifest" 0x00000001
SectionEnd

提示

将编译好的程序放置在VNISEDIT.exe同目录下运行后即可解除提权警告!