關于HM NISEDIT在新版系統下編譯并運行提示權限不足問題的解決方案

如果你使用過NSIS為你的項目制作過安裝包,那HM nisedit一定是你繞不過去的檻,作為NSIS號稱的最佳免費IDE/編輯器,功能齊全,與NSIS配合性能強悍 , 實至名歸 。只是開發作者最后版本更新在2005年已經停止,國內漢化版修修補補也僅僅堅持到2006年未再繼續,時至今日,已經過去十幾年,與新版操作系統和新版NSIS(3.0X)出現了各種不兼容和BUG,其中最典型的莫過于在vnsiedit中編輯好腳本后使用“編譯并運行”功能,會出現請求的操作需要提升,代碼740系統警告并停止執行,

關于HM NISEDIT在新版系統下編譯并運行提示權限不足問題的解決方案

文章插圖
【關于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'SectionGetTempFileName $R0FileOpen $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" 0x00000001SectionEnd
提示:
將編譯好的程序放置在VNISEDIT.exe同目錄下運行后即可解除提權警告!

    推薦閱讀