我对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,所以...)。
不管怎样,我的问题是:
有谁知道的一种方式(使用“运行方式”或其他方式)来打开请求的用户名和密码的对话框,检查凭证并继续安装,只有当他们退房?
另外,我知道有一种方法来设置一个安装程序,使它带有一个很好的盾牌图标,让用户知道管理员权限将被请求。有谁知道如何做到这一点?
任何帮助将非常感谢,因为这是目前唯一阻止我的应用程序的部署。
什么是“系统::分配64 ”您丢弃指针后泄漏和内存泄漏。 NSIS始终为32位,因此您对循环的评论没什么意义...... – Anders 2012-01-04 22:10:22
“即使在上下文菜单中选择”以管理员身份运行“,它们也绝对阻止任何非Admin用户打开安装程序”这不会听起来很对!什么是Windows版本和UAC设置? – Anders 2012-01-04 22:29:14
$ command变量是您想要执行的事情,“calc.exe”等。 – Anders 2012-01-04 23:06:55