赞
踩
如果你使用过NSIS为你的项目制作过安装包,那HM vnisedit一定是你绕不过去的槛,作为NSIS号称的最佳免费IDE/编辑器,功能齐全,与NSIS配合性能强悍,实至名归。只是开发作者最后版本更新在2005年已经停止,国内汉化版修修补补也仅仅坚持到2006年未再继续,时至今日,已经过去十几年,与新版操作系统和新版NSIS(3.0X)出现了各种不兼容和BUG,其中最典型的莫过于在vnisedit中编辑好脚本后使用“编译并运行”功能,会出现请求的操作需要提升,代码740系统警告并停止执行,
经过分析,我个人认为这与新操作系统安全机制更新有直接关系,说到这里,又不得不提及windows的用户帐户控制(UAC)机制,从 Windows Vista开始,微软引入了额外的安全级别(UAC),要求在安装应用程序完成其他任务之前提示用户输入管理密码,以标准用户身份登录到 Windows Vista 的用户(Vista 的默认登录名)只能写入磁盘上的特定位置。在 Windows 7 及更高版本上,UAC 的侵入性比在 Vista 上要小的多。但这些安全机制的更改,仍然让HM VNISEDIT这类开发应用于XP及更低系统的应用出现了各种不兼容。而当前新开发应用应对UAC控制的主要办法是为程序配置嵌入程序清单,注明执行级别!至于开发于小二十年前的VNISEDIT,由于受当时开发环境所限,根本没有嵌入完善的程序清单,这是当前在使用中会出现需要提升权限的直接原因!
解决方案:
既然原因找到,那接下来就是解决问题了,没有程序清单,有两个解决方案,1.重新编译VnISedit,为其嵌入完善的程序清单。2.直接为现有的VNISedit配置外部清单。因为我们是在解决当前的使用bug,而不是为新系统重新改良VnISedit的整体兼容性,所以第二个方案就成了不二选择!
所谓程序清单,其实是一个XML文件,正常情况下会在程序或应用编译时被嵌入其中,当然,如果你不嫌弃业余或不优雅,外置清单也是可以使用的!具体到NSIS中,实战脚本如下:
- #编写:水晶石
- #给vnsiedit添加外部程序清单并强制优先使用
- OutFile 'Nsistest.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 ' <dependency>$\r$\n'
- FileWrite $1 ' <dependentAssembly>$\r$\n'
- FileWrite $1 ' <assemblyIdentity$\r$\n'
- FileWrite $1 ' type="win32"$\r$\n'
- FileWrite $1 ' name="Microsoft.Windows.Common-Controls"$\r$\n'
- FileWrite $1 ' version="6.0.0.0"$\r$\n'
- FileWrite $1 ' publicKeyToken="6595b64144ccf1df"$\r$\n'
- FileWrite $1 ' language="*"$\r$\n'
- FileWrite $1 ' processorArchitecture="*"/>$\r$\n'
- FileWrite $1 ' </dependentAssembly>$\r$\n'
- FileWrite $1 " </dependency>$\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$\r$\n'
- FileWrite $1 ' level="requireAdministrator"$\r$\n'
- FileWrite $1 ' 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同目录下运行后即可解除提权警告!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。