Nsis 使用Win7和UAC插件进行静默安装

Nsis 使用Win7和UAC插件进行静默安装,nsis,uac,silent-installer,Nsis,Uac,Silent Installer,我有一个可以处理命令行参数和静默安装的安装程序。我最近升级了安装程序,通过使用并将RequestExecutionLevel从admin切换到user来更好地符合Vista/W7 UAC管理标准 测试表明,UAC插件在GUI模式和命令行静默模式下的权限提升方面运行良好(尽管由于提升对话框,“静默”安装实际上并非完全“静默”) 现在,客户告诉我,在将我的设置包装到第三方部署工具中时,他们的工具得到了1223()错误代码(似乎是“用户取消了提升”)。我的安装程序没有通过errorlevel直接返回错

我有一个可以处理命令行参数和静默安装的安装程序。我最近升级了安装程序,通过使用并将
RequestExecutionLevel
admin
切换到
user
来更好地符合Vista/W7 UAC管理标准

测试表明,UAC插件在GUI模式和命令行静默模式下的权限提升方面运行良好(尽管由于提升对话框,“静默”安装实际上并非完全“静默”)

现在,客户告诉我,在将我的设置包装到第三方部署工具中时,他们的工具得到了
1223
()错误代码(似乎是“用户取消了提升”)。我的安装程序没有通过
errorlevel
直接返回错误代码,因此我猜测该代码是从UAC插件返回的,该插件似乎在系统“runas”对话框中执行提升操作

  • 关于返回代码的来源,我说得对吗?虽然当我取消提升对话框时,我得到的是错误级别5(拒绝访问),而不是1223

  • 为了集成UAC插件,我正在使用在
    .onInit
    开头调用的
    InitElevation
    宏,可以吗

  • 我不确定是否正确理解UAC插件在静默模式下的行为:在开关的
    0
    情况下,键似乎位于插件dll的
    函数中。如果NSIS dilaog由于静默模式而不可见(或不存在?),它会使“runas”调用失败吗?在我的测试环境中,当从命令行调用silet设置时,这是正常的,但是如果从部署工具调用呢

  • 集成UAC插件的宏:

    !宏初始化事件
    uac_tryagain:
    ${Debug}“初始化UAC_运行提升”
    !插入宏UAC_
    ;${debug}“$$0=$0$$1=$1$$2=$2$$3=$3”
    ${Switch}$0
    ${Case}0
    ${IfThen}$1=1${{124;}退出${};我们是外部过程,内部过程完成了它的工作,我们完成了
    ${If}$30;如果我们是管理员
    系统::调用“kernel32::GetCurrentProcessId()i.r0”
    ${If}${UAC_isinnelistance}
    ; 如果我们处于提升过程中,我们需要获得祖父母的PID作为控制台
    ${GetProcessParent}$0$ConsoleParentPID
    ;${Debug}“从提升的$0进程,父进程是$ConsoleParentPID”
    ${GetProcessParent}$ConsoleParentPID$ConsoleParentPID
    ;${Debug}“父进程为$ConsoleParentPID”
    ${Else}
    ;${Debug}“我们是一个已经提升的进程”
    StrCpy$ConsoleParentPID-1
    ${EndIf}
    ${Break};我们是管理员(无论是否升级),让节目继续吧
    ${EndIf}
    ${If}$1=3;运行方式已成功完成,但使用的是非管理员用户
    MessageBox mb|u YesNo | mb|u iconnextracation | mb|u top | mb|u SetForeground“此${thing}需要管理员权限,请重试”/SD IDNO IDNO IDNO ides uac|u tryagain IDNO 0
    ${EndIf}
    ;摔死
    ${Case}1223
    MessageBox mb|u IconStop | mb|u top | mb|u SetForeground“此${thing}需要管理员权限,正在中止!”
    退出
    ${Case}1062
    MessageBox mb|u IconStop | mb|u top | mb|u set前台“登录服务未运行,正在中止!”
    退出
    ${Default}
    MessageBox mb|U IconStop | mb|U TopMost | mb|U SetForeground“无法提升,错误$0”
    退出
    ${EndSwitch}
    ${Debug}“结束UAC_运行提升的初始化”
    !宏端
    
    宏调用(开始于
    .onInit
    ):

    ;如果管理员未启动,则中止
    !insertmacro初始化“安装程序”
    ${If}${UAC_isinnelistance}
    ${AndIfNot}${UAC_IsAdmin}
    SetErrorLevel 0x666666;外部实例的特殊返回值,以便它知道我们没有管理员权限
    退出
    ${EndIf}
    
    我想我需要重现这一点所需的确切步骤,我很久没有接触过UAC插件了,我通常建议人们远离它…@Anders:现在很难准确地知道环境,因为问题发生在客户系统上,而且部署系统我没有本地测试(Empirum)。您能否详细说明为什么建议人们不要使用UAC插件以及什么应该是正确的替代方案?没有替代方案,如果您安装到ProgramFiles/HKLM中,则您正在进行全用户/机器安装,并且不应触摸任何用户配置文件/HKCU。这也意味着您不应该在“完成”页面上有“运行”复选框,因为它将以错误的用户身份运行。。。基本上,您的安装类型应该遵循您的RequestExecutionLevel值(最高允许双模式(SHCTX))@Anders:嗯,我的setupp允许在“为自己安装”/“为所有人安装”之间进行选择,并显示最后的“运行”复选框:UAC插件特别适用于在管理员配置文件设置后以正确的未提升配置文件启动应用程序。似乎我一直在寻找插件的问题:)我的看法是,仅仅运行复选框就太多了。我建议使用“RequestExecutionLevel highest”并在为所有人安装或使用时隐藏复选框,这有点像黑客,在少数情况下会失败,但使用起来要简单得多。。。