Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Windows 綜合教學 >> 關於 Windows

NSIS 打包安裝程式在 Win7 無法建立桌面捷徑?加入 RequestExecutionLevel admin 解決權限問題

編輯:關於 Windows

使用 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 替換為您主程式執行檔名稱。
  • 若偵測到執行中 (返回 1),彈出警告並中止解除安裝。

完整腳本架構範例

; --- 標頭 ---
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。
  • 簽署安裝程式 (Code Signing) 可減少 UAC 提示的恐懼感,提升信任度。

一行 RequestExecutionLevel admin,徹底解決 NSIS 在 Win7+ 環境下的權限不足問題,讓捷徑、註冊表、服務安裝全數正常運作。

Copyright © Windows教程網 All Rights Reserved