Installation 由于UAC的原因,NSIS installer.onInit和un.onInit运行了两次

Installation 由于UAC的原因,NSIS installer.onInit和un.onInit运行了两次,installation,nsis,uninstallation,Installation,Nsis,Uninstallation,您好,我正在重构一个旧的安装脚本,并遇到了UAC插件造成的问题。因为!insertmacro Init“installer”该.onInit运行两次。这同样适用于!插入宏初始化“卸载程序”和un.onInit函数 因此,安装程序和卸载程序会运行两次,这不是我想要的行为,例如,当它接触到C://驱动器时,它是必需的,但外部进程也会运行安装程序 由于安装脚本相当长,我只粘贴.onInit函数。可以找到整个.nsi脚本 用注释掉这行!insertmacro确保.onInit函数运行一次,但不再运行安装

您好,我正在重构一个旧的安装脚本,并遇到了UAC插件造成的问题。因为
!insertmacro Init“installer”
.onInit
运行两次。这同样适用于
!插入宏初始化“卸载程序”
un.onInit
函数

因此,安装程序和卸载程序会运行两次,这不是我想要的行为,例如,当它接触到
C://
驱动器时,它是必需的,但外部进程也会运行安装程序

由于安装脚本相当长,我只粘贴
.onInit
函数。可以找到整个
.nsi
脚本

注释掉这行!insertmacro
确保
.onInit
函数运行一次,但不再运行安装程序。那么,我如何才能使安装程序和卸载程序只运行一次,并具有正确的(管理员)权限

我感谢您的建议或回答:)


据我所知,UAC插件使用一个特殊参数重新启动安装程序。您可以使用和在
.onInit
中检查,然后有条件地显示消息:

# get all commandline parameters
${GetParameters} $0

# parse specific option
${GetOptions} $0 "/UAC:" $1

# do stuff
IfErrors 0 +2
MessageBox MB_OK "No admint" IDOK +2
MessageBox MB_OK "Admin"
就我个人而言,我会在最后一部分使用
LogicLib

# do stuff
${If} $1 == ""
  MessageBox MB_OK "Not admin"
${Else}
 MessageBox MB_OK "Admin"
${Endif}

据我所知,UAC插件使用一个特殊参数重新启动安装程序。您可以使用和在
.onInit
中检查,然后有条件地显示消息:

# get all commandline parameters
${GetParameters} $0

# parse specific option
${GetOptions} $0 "/UAC:" $1

# do stuff
IfErrors 0 +2
MessageBox MB_OK "No admint" IDOK +2
MessageBox MB_OK "Admin"
就我个人而言,我会在最后一部分使用
LogicLib

# do stuff
${If} $1 == ""
  MessageBox MB_OK "Not admin"
${Else}
 MessageBox MB_OK "Admin"
${Endif}
您链接到的代码(至少当我看到它时)同时调用了
!insertmacro UAC_运行提升版
!在.onInit中插入宏Init“installer”
,难怪它会运行多次。调用
后!insertmacro UAC_运行提升
您必须始终选中
$0
,因为您可能需要根据其值调用
退出

我假设Init宏是我写的(?)所以它应该正常工作;)

我个人建议您在“完成”页面上取消“运行”复选框,然后您可能根本不必使用UAC插件……

您链接到的代码(至少当我看到它时)称之为“代码”!insertmacro UAC_运行提升版和
!在.onInit中插入宏Init“installer”
,难怪它会运行多次。调用
后!insertmacro UAC_运行提升
您必须始终选中
$0
,因为您可能需要根据其值调用
退出

我假设Init宏是我写的(?)所以它应该正常工作;)


我个人建议您放弃“完成”页面上的“运行”复选框,然后您可能根本不必使用UAC插件…

谢谢您的建议。我已经添加了您建议的行,它在第一次运行时显示一个空对话框,在提升权限对话框后的第二次运行时显示
/UAC:/NCRC
。听起来我想要后一种情况,有没有办法检查一下?谢谢你的建议。我已经添加了您建议的行,它在第一次运行时显示一个空对话框,在提升权限对话框后的第二次运行时显示
/UAC:/NCRC
。听起来我想要后一种情况,有没有办法检查一下?粘贴在这里的.onInit代码与链接到的代码不匹配!您链接到的代码有一个明显的问题,如果不测试我自己,就无法真正判断粘贴在这里的代码是否有问题,但在您澄清我应该测试的代码之前,我不会这样做。有一些关于NSIS/UAC插件/Windows版本的信息也会很好…@Anders我正在推和尝试一些东西,同时我键入这个。对不起,如果现在不一样的话。考虑链接中的代码,我正在运行的当前代码。另外,我正在Windows 2008 64位服务器上构建它,并在Windows 10机器(也是64位)上测试安装过程。@Anders我已经撤消了一些实验性更改并将其推送。我暂时不推它,因为当人们看到它时,它确实令人困惑。您粘贴在此处的.onInit代码与您链接到的代码不匹配!您链接到的代码有一个明显的问题,如果不测试我自己,就无法真正判断粘贴在这里的代码是否有问题,但在您澄清我应该测试的代码之前,我不会这样做。有一些关于NSIS/UAC插件/Windows版本的信息也会很好…@Anders我正在推和尝试一些东西,同时我键入这个。对不起,如果现在不一样的话。考虑链接中的代码,我正在运行的当前代码。另外,我正在Windows 2008 64位服务器上构建它,并在Windows 10机器(也是64位)上测试安装过程。@Anders我已经撤消了一些实验性更改并将其推送。我暂时不推它,因为当人们看到它时,它确实令人困惑。感谢你的回答Anders,我已经插入了UAC_RunElevated作为测试,以查看我做的第一件事是否是获得额外的权限,也许我可以添加一个检查,看看是否有@idleberg提到的任何参数可以检查。不幸的是,只有这个!insertmacro Init“installer”也可以让它运行两次。我要检查一下,如果没有你建议的UAC插件,我是否可以做到这一点,谢谢你的帮助和建议:)我删除了它,在这里和那里重构了文件,它运行得非常出色。谢谢感谢您的回答Anders,我插入了UAC_作为测试,看看我做的第一件事是否是获得额外的权限,也许我可以添加一个检查,看看是否有@idleberg提到的任何参数可以检查。不幸的是,只有这个!insertmacro Init“installer”也可以让它运行两次。我要检查一下,如果没有你建议的UAC插件,我是否可以做到这一点,谢谢你的帮助和建议:)我删除了它,重构了它