【问题标题】:NSIS: Installing an Application to always Run as AdministratorNSIS:安装应用程序以始终以管理员身份运行
【发布时间】:2012-02-07 22:32:15
【问题描述】:

我有一个适用于大型应用程序的 NSIS 脚本。我在网上阅读了许多主题,但无法得到以下明确答案:是否可以使用 NSIS 安装应用程序,该应用程序在启动时(无论用户类型如何)自动以管理员身份运行?如果可以的话,如何实现?

注意:我已经强制要求 NSIS 包必须使用 admin 运行

RequestExecutionLevel admin

我已尝试使用此 method 将 UAC 要求写入应用程序注册表项,但我无法编译 RUNASADMIN 命令,因为它不是 NSIS 所需的格式。

【问题讨论】:

    标签: installation uac nsis


    【解决方案1】:

    为了确保安装程序通常以管理员身份运行,我推荐这个小例子:

    Outfile RequireAdmin.exe
    RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)
    
    !include LogicLib.nsh
    
    Function .onInit
    UserInfo::GetAccountType
    pop $0
    ${If} $0 != "admin" ;Require admin rights on NT4+
        MessageBox mb_iconstop "Administrator rights required!"
        SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
        Quit
    ${EndIf}
    FunctionEnd
    
    Page InstFile
    
    Section
    SectionEnd
    

    如果安装的应用程序总是需要以管理员身份运行,则它应该执行类似的步骤,对于 Win32 应用程序来说:

    如果“自动以管理员身份运行”是指绕过 UAC 提升,那么不,那是不可能的,UAC 的全部意义在于允许用户确认/拒绝特权操作!一些应用程序通过安装一个 NT 服务来解决这个问题,该服务代表应用程序执行它们需要的任何操作。我不建议这样做,因为它会使用户机器充满服务,如果服务编码不正确,可能会削弱系统的安全性。

    如果您没有编写要安装的应用程序,那么您的选择会受到更多限制。如果应用程序根本没有清单,您可以使用external (myapp.exe.manifest) 显现。

    在 AppCompatFlags 键下设置 RUNASADMIN 字符串并不是安装程序真正应该做的事情,那些兼容性选项应该由用户控制,而不是应用程序。

    您链接到的论坛帖子还告诉您two ways 在快捷方式上设置SLDF_RUNAS_USER 标志,这不能确保应用程序在所有情况下都以管理员身份启动,只有当应用程序是从快捷方式开始,但如果您无法更改应用程序本身,它可能是您唯一的选择...

    【讨论】:

      【解决方案2】:

      我简直是在用头撞砖墙,试图做这件事。

      正如@Anders 所说:

      在 AppCompatFlags 键下设置 RUNASADMIN 字符串并不是安装程序真正应该做的事情,那些兼容性选项应该由用户控制,而不是应用程序。

      这是正确的。但是,在某些情况下需要这样做。如果您确实遇到这种情况,那么您可以按照this site I found 的说明进行操作。

      TL;DR

      在您的 installer.nsh 文件(或等效文件)中插入以下内容之一

      ; Valid for the current user
      WriteRegStr HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\${MAIN_PROGRAM_NAME}M.exe" "RUNASADMIN" 
       
       ; Effective for all users
      WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\${MAIN_PROGRAM_NAME}M.exe" "RUNASADMIN" 
      

      【讨论】:

        猜你喜欢
        • 2011-09-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2013-03-01
        • 2011-09-24
        • 2010-12-19
        • 1970-01-01
        • 2011-12-29
        相关资源
        最近更新 更多