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



我是NSIS的新手。我试图请求管理员权限,以便运行安装程序,因为它与注册表有点混乱。我的问题与"RequestExecutionLevel"one_answers"MULTIUSER_EXECUTIONLEVEL"是,他们都绝对阻止任何非管理员用户打开安装程序,即使在上下文菜单中选择"以管理员身份运行"。我试过使用RunAs DLL,但我没有找到一个线程,什么放在$命令变量传递给"RunAsW"函数。

这是我的代码:

     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"或其他)打开一个对话框,要求用户名和密码,检查凭据,并继续安装,只有当他们检查出来?

另外,我知道有一种方法可以设置一个安装程序,使其带有漂亮的屏蔽图标,让用户知道将请求Admin权限。有人知道怎么做吗?

任何帮助将非常感激,因为这是目前唯一的事情阻止我的应用程序的部署。

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 InstFiles
Section
SectionEnd

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

在自定义页面上提示凭据是没有意义的,除非安装过程的一部分需要管理员访问,而另一部分需要访问用户配置文件。如果这适用于你,那么你应该看看UAC插件(它使用起来有点复杂,使你的exe文件不可能获得屏蔽覆盖图标)

我不认为RunAs插件在Vista+上正确工作,当UAC打开时,所以试图让它工作可能是一个死胡同…

获得屏蔽的推荐方法是在exe清单中请求提升,RequestExecutionLevel admin就是这样做的。如果你在脚本中根本不使用RequestExecutionLevel,你的安装程序可能会被检测到是一个旧的安装程序,它也会得到屏蔽覆盖。

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

最新更新