使用 NSIS (Nullsoft Scriptable Install System) 打包安裝程式時,安裝完成卻發現桌面捷徑未建立、開始選單項目缺失。原因在於 Win7/UAC 機制下,安裝程式預設以標準使用者權限執行,無法寫入 C:\Users\Public\Desktop (All Users 桌面) 或 C:\ProgramData\Microsoft\Windows\Start Menu 等需管理員權限的路徑。在腳本最前端加入一行指令即可解決。
在 .nsi 腳本開頭(!include 之後、Name 之前)加入:
RequestExecutionLevel admin
此指令會讓安裝程式啟動時觸發 UAC 提示,取得管理員權限,後續 CreateShortcut、WriteRegStr (HKLM) 等操作即可正常寫入系統級路徑。
避免使用者在程式執行中強制解除安裝導致殘留檔案/註冊表,可在 un.onInit 函數加入檢測邏輯:
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您確定要完全移除 $(^Name) 及所有元件嗎?" IDYES +2
Abort
; 檢測程式進程
FindProcDLL::FindProc "AirStation.exe"
Pop $R0
IntCmp $R0 1 0 no_run
MessageBox MB_ICONSTOP "解除安裝程式檢測到 ${PRODUCT_NAME} 正在執行,請關閉後再解除安裝!"
Quit
no_run:
FunctionEnd
FindProcDLL 外掛(!include "FindProcDLL.nsh")。AirStation.exe 替換為您主程式執行檔名稱。; --- 標頭 ---
RequestExecutionLevel admin
InstallDir "$PROGRAMFILES\MyApp"
!include "MUI2.nsh"
!include "FindProcDLL.nsh"
; ... 安裝區段 ...
; --- 解除安裝區段 ---
Section "Uninstall"
!insertmacro MUI_UNINSTALL_INSTALLDIR
Delete "$INSTDIR\*.*"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\MyApp\*.*"
RMDir "$SMPROGRAMS\MyApp"
Delete "$DESKTOP\MyApp.lnk"
SectionEnd
Function un.onInit
; 上述檢測邏輯
FunctionEnd
RequestExecutionLevel admin 會導致安裝程式圖示帶有 UAC 盾牌,使用者需點擊「是」授權。HKCU、$APPDATA、$DESKTOP (當前使用者桌面),可用 RequestExecutionLevel user 或預設 highest。一行 RequestExecutionLevel admin,徹底解決 NSIS 在 Win7+ 環境下的權限不足問題,讓捷徑、註冊表、服務安裝全數正常運作。