NSIS:安装应用程序以始终以管理员身份运行

时间:2012-01-11 15:03:06

标签: installer uac nsis

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

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

admin运行
RequestExecutionLevel admin

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

2 个答案:

答案 0 :(得分:18)

为确保安装程序以管理员身份运行,我建议使用以下小例子:

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服务来解决这个问题,该服务执行代表应用程序所需的任何操作。我不建议这样做,因为它会向用户提供服务,并且如果服务编码不正确,可能会削弱系统的安全性。

如果您没有编写正在安装的应用程序,那么您的选项会受到更多限制。如果应用程序根本没有清单,您可以使用externalmyapp.exe.manifest)  表现。

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

您链接的论坛主题也会告诉您two ways在快捷方式上设置SLDF_RUNAS_USER标记,这不能确保应用程序在所有情况下都以管理员身份启动,仅当应用程序从快捷方式启动时,如果您无法更改应用程序本身,它可能是您唯一的选择...

答案 1 :(得分:0)

我真的是在用头撞砖墙试图做这件事。

正如@Anders 所说:

<块引用>

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

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

TL;博士

在您的 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"