簡體   English   中英

NSIS卸載程序權限級別

[英]NSIS Uninstaller Permission Level

我有一個生成卸載程序的NSIS安裝程序腳本。 卸載程序在創建時需要提升權限才能執行。 某些要求使得我需要能夠以沒有提升權限級別的任何用戶運行卸載程序。 生成的其他所有文件都不是使用提升的權限設置的,甚至也不是應用程序可執行文件本身。 有沒有辦法為任何用戶設置權限級別? 這是我的NSIS腳本。 我已從腳本中刪除了很多內容,以便應用程序保持匿名,但保留了我認為相關的所有內容

Function .onInit
    UserInfo::GetAccountType
    pop $0
    ${If} $0 != "admin"
        MessageBox mb_iconstop "Administrator rights required!"
        SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
        Quit
    ${EndIf}

    ${IfNot} ${AtLeastWin7}
      MessageBox MB_OK "Application requires at minimum Windows 7 as the installed operating system. Exiting installation..."
      Quit
    ${EndIf}

    IntOp $0 ${SF_SELECTED} | ${SF_RO}
    SectionSetFlags ${SecApp} $0
FunctionEnd

; sections
Section "AppSection" SecApp
    ... installer stuff
    WriteRegStr HKCU "${AppRegistryPath}" \
                     "UninstallString" "$\"$INSTDIR\Uninstall.exe$\""

    WriteUninstaller "$INSTDIR\Uninstall.exe"
    ... more installer stuff
SectionEnd

Section "Uninstall"
    ; code that terminates the running application

    ; code that removes a firewall rule

    DetailPrint "Removing files and directories"
    Delete "$INSTDIR\*"
    Delete "$INSTDIR\x86\*"
    Delete "$INSTDIR\x64\*"
    Delete "$INSTDIR\fonts\*"
    RMDir "$INSTDIR\x86"
    RMDir "$INSTDIR\x64"
    RMDir "$INSTDIR\fonts"
    RMDir "$INSTDIR"

    DetailPrint "Removing registry values"
    DeleteRegKey HKCU "${AppRegistryPath}"
    DeleteRegKey HKCU "${AppPath}"
    DeleteRegKey HKLM "${AppRegistryPath}"
    DeleteRegKey HKLM "${AppPath}"
SectionEnd

卸載程序使用與安裝程序相同的清單,清單的UAC部分由RequestExecutionLevel設置。

您可以嘗試使用RequestExecutionLevel highest ,它只會提升管理員,普通用戶將正常運行應用程序而無需任何提示。 un.onInit使用UserInfo::GetAccountType ,如果需要提升,則中止並顯示錯誤消息。

您也可以使用ExecShell "RunAs" '"$ExePath"'重新啟動並請求提升(您仍需要使用UserInfo::GetAccountType進行驗證)。

查看UAC插件 除此之外,它還允許您控制何時請求腳本提升,因此您可以讓卸載部分跳過這樣做。

對於Windows Vista或更高版本,標記程序的正確方法是在應用程序中嵌入應用程序清單,告訴操作系統應用程序需要什么。 此應用程序清單中有一些屬性允許開發人員指定其程序requested execution levelrequested execution level

請求級別選項如下:

  • 作為Invoker - 應用程序使用與父進程相同的訪問令牌運行。 (推薦用於標准用戶應用程序)
  • 最高可用性 - 應用程序以當前用戶可以獲得的最高權限運行。 (推薦用於混合模式應用)
  • 需要管理員 - 應用程序僅為管理員運行,並要求使用管理員的完全訪問令牌啟動應用程序。 (建議僅供管理員使用)
  • 無執行級別信息 - 應用程序沒有嵌入式request execution level清單。

除非應用程序設計為由系統管理員獨占運行,否則應以盡可能少的權限運行。

沒有執行級別

在Windows Vista及更高版本上,如果在應用程序的清單中未設置任何執行級別信息,並且之前未提升應用程序,則應用程序將在傳統模式下運行以獲得向后兼容性支持。 在此模式下,操作系統使用虛擬化機制來訪問文件系統和注冊表。 這意味着它嘗試在受限文件夾位置創建或更改文件或在注冊表限制的配置單元中寫入被重定向(反映)到“每用戶”可訪問的位置。 有關如何應用此處的更多信息,請參閱VirtualStore

有關此主題的更多信息,請參見此處: Windows用戶帳戶控制


在我上面鏈接的頁面(Windows用戶帳戶控制)是一個鏈接,您可以在其中下載xml文件中包含這些request execution level屬性的一些清單。 在你的情況下,我會用你想要的執行級別編輯其中一個。 使用以下代碼片段可以完成此操作:

Section "Uninstall"
    !define RequestLevel User
    !define ResHacker    `${NSISDIR}\Contrib\Manifests\ResHacker.exe`
    !define ManifDir     `${NSISDIR}\Contrib\Manifests`
    !define Manifest     `NSIS_2.46_Win8`
    !packhdr             `$%TEMP%\exehead.tmp` `"${Reshacker}" -addoverwrite "%TEMP%\exehead.tmp", "%TEMP%\exehead.tmp", "${ManifDir}\${Manifest}_${RequestLevel}.manifest", 24,1,1033`

    # The rest of your code...
SectionEnd

您需要的所有必需文件位於上述網頁底部的可下載zip文件中。 還將更詳細地解釋如何使用它。

注意 :雖然我同意Anders,因為您需要提升權限來刪除HKLM密鑰,搞亂防火牆設置等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM