2012-01-04 998 views
11

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

这是我(相当砍死时)代码:

 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 

很多,这只是猜测和反复试验。 (顺便说一句 - 我也试过运行一个循环来获得所有的管理员,但它似乎只用于32位机器的DLL,所以...)。

不管怎样,我的问题是:

有谁知道的一种方式(使用“运行方式”或其他方式)来打开请求的用户名和密码的对话框,检查凭证并继续安装,只有当他们退房?

另外,我知道有一种方法来设置一个安装程序,使它带有一个很好的盾牌图标,让用户知道管理员权限将被请求。有谁知道如何做到这一点?

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

+0

什么是“系统::分配64 ”您丢弃指针后泄漏和内存泄漏。 NSIS始终为32位,因此您对循环的评论没什么意义...... – Anders 2012-01-04 22:10:22

+0

“即使在上下文菜单中选择”以管理员身份运行“,它们也绝对阻止任何非Admin用户打开安装程序”这不会听起来很对!什么是Windows版本和UAC设置? – Anders 2012-01-04 22:29:14

+0

$ command变量是您想要执行的事情,“calc.exe”等。 – Anders 2012-01-04 23:06:55

回答

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文件无法得到屏蔽层图标)

我不认为RunAs plug-in工作正常在Vista +当UAC是如此试图让它工作可能是一个死胡同......

获得盾的recommended way是请求在EXE清单中提升,RequestExecutionLevel admin这样做。如果您的脚本中完全不使用RequestExecutionLevel,则可以将安装程序作为旧版安装程序进行检测,并且还会获得屏蔽覆盖。

在Windows Vista中,如果可执行文件需要提升推出, 然后可执行文件的图标应该是“盖章”用盾牌图标 指出这一事实。可执行文件的应用程序清单必须标记 “requireAdministrator”来指定可执行文件为需要完整的 管理访问令牌。盾牌图标叠加层也将自动放置在可执行文件上,该文件被视为需要根据安装程序检测启发式标高提供 。例如,即使可执行文件没有嵌入式应用程序清单,名为setup.exe的 文件也会自动收到屏蔽图标覆盖 。

+1

Thnx Anders。恢复为只有RequestExecutionLevel w/o RunAs并通过将“RequestExecutionLevel admin”移动到页面顶部来解决它。现在Windows自动提示管理员登录... – 2012-01-08 08:11:56

+0

此信息对我有帮助。谢谢,安德斯。 – 2012-02-03 22:29:51

相关问题