如何使用NSIS请求管理员权限?

时间:2012-01-04 18:32:40

标签: nsis administrator runas

我对NSIS很新。 我试图请求管理员权限以运行安装程序,因为它与注册表有点混淆。 我对“RequestExecutionLevel”和“MULTIUSER_EXECUTIONLEVEL”的问题是,即使在上下文菜单中选择“以管理员身份运行”,它们也绝对阻止任何非管理员用户打开安装程序。 我已经尝试过使用RunAs DLL,但是我没有找到一个关于将什么放入传递给“RunAsW”函数的$ command变量的线程。

这是我(非常黑客)的代码:

     StrCpy $0 0
     StrCpy $1 ""
     System::Call 'RunAs::GetAdministrators(w r1, *i .r0) i .r2 ? u'
     System::Alloc 64
     Pop $4
     StrCpy $4 $2
     StrCpy $5 ""
     loop:
          IntCmp $0 0 endloop
          System::Call '*$4(w .r3)'
          StrCpy $5 "$5|$3"
    endloop:
    System::Free $4   ; we free the memory used by the array
    StrCpy $5 "$5" "" 1
    !insertmacro MUI_INSTALLOPTIONS_WRITE "Settings.ini" "Field 1" "ListItems" $5
     !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings.ini"
     !insertmacro MUI_INSTALLOPTIONS_READ $1 "UserPass" "Field 1" "State"
     !insertmacro MUI_INSTALLOPTIONS_READ $2 "Settings.ini" "Field 2" "State"
     StrCpy $3 "%%LOGONSERVER%%"
     StrCpy $3 0
     StrCpy $4 0
     System::Call 'RunAs::RunAsW(w r1, w r2, w r3, *w .r4) i .r0 ? u'
     MessageBox MB_OK $0
     IntCmp $0 1 success
     Quit
     success:
     !insertmacro MUI_LANGDLL_DISPLAY

很多只是猜测工作和反复试验。 (顺便说一句 - 我也尝试通过循环来获取所有管理员,但似乎DLL仅适用于32位计算机,所以......)。

无论如何,我的问题是:

是否有人知道某种方式(使用“RunAs”或其他方式)打开请求用户名和密码的对话框,检查凭据并仅在签出时继续安装?

此外,我知道有一种方法可以设置一个安装程序,以便它附带一个漂亮的盾牌图标,让用户知道将要求管理员权限。有人知道怎么做吗?

非常感谢任何帮助,因为这是目前阻止部署我的应用程序的唯一方法。

1 个答案:

答案 0 :(得分:22)

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

是我通常建议的基本代码,以确保安装程序以管理员身份运行。

恕我直言,在自定义页面上提示凭据没有意义,除非只有部分安装过程需要管理员访问权限而另一部分需要访问用户配置文件。如果这适用于你那么你应该看一下UAC plug-in(使用起来有点复杂,你的exe文件无法获得盾牌叠加图标)

当UAC开启时,我认为RunAs plug-in在Vista +上无法正常工作,所以试图让它工作可能是一个死胡同......

获取屏蔽的recommended way是在exe清单中请求提升,RequestExecutionLevel admin这样做。如果您的脚本中根本没有使用RequestExecutionLevel,则安装程序可能会被检测为旧版安装程序,并且还会获得屏蔽覆盖。

  

在Windows Vista中,如果可执行文件需要提升才能启动,   那么可执行文件的图标应该用“盾牌”图标“盖章”   表明这一事实。可执行文件的应用程序清单必须标记   “requireAdministrator”将可执行文件指定为需要完整   管理访问令牌。盾牌图标覆盖也将是   自动放置在被认为需要的可执行文件上   根据安装程序检测启发式提升。例如,a   名为setup.exe的文件将自动接收盾牌图标覆盖   即使可执行文件没有嵌入式应用程序清单。