我对 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”或其他方式)打开一个请求用户名和密码的对话框,检查凭据并仅在他们签出后继续安装?
另外,我知道有一种方法可以设置安装程序,以便它带有漂亮的盾牌图标,让用户知道将请求管理员权限。有人知道该怎么做吗?
任何帮助将不胜感激,因为这是目前唯一阻止我的应用程序部署的事情。