具有管理员访问权限的NSIS无法通过批处理脚本创建注册表项

问题描述

我有一个设置了RequestExecutionLevel admin的NSIS脚本,并在其中调用了一个.bat脚本,该脚本添加了一个注册表项。

通过执行时,将添加reg键。但是,在运行安装程序时,它会执行.bat文件,但无法添加reg键。

nsExec::ExecToStack '"$pluginsdir${SETUP_PATH}\UpdateNtpConfiguration.bat" $Ip1'

UpdateNtpConfiguration.bat内容

set adds=%1
REM Get the list of ntp servers showing up in System Date & Time->Internet Time dropdown
set "num=0"
for /F %%G in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers ^| findstr "^[^a-z] ^("') do if %%G GTR !num! set "num=%%G"
set /A num=num + 1
REM Add address at the end
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers /v "%num%" /t REG_SZ /d  "%adds%" /f
goto:eof

解决方法

就像@Anders所说的那样,有内置函数。 https://nsis.sourceforge.io/Docs/Chapter4.html#registry

如果此命令发生错误,由于它是内置的,调试起来会容易得多。

如果您在批处理文件中没有执行任何其他操作,则最好找出NSIS是否已经集成了命令...。

编辑:

也可能是管理员安装程序在没有admin privs的情况下运行了bat文件。

,

经过一些调试后,发现NSIS正在32位reg空间(HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft)中写入注册表值。我必须附加/ reg:64使其添加到64位reg空间中。

我之所以拥有bat脚本,是为了在添加密钥之前有一些逻辑来寻找重复项。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...