NSIS无权限下检测C:\Windows\System32中DLL存在性问题
NSIS检测System32中vcruntime140_1.dll失败的解决方法
我正尝试通过NSIS检测C:\Windows\System32文件夹中是否存在vcruntime140_1.dll,但检测始终返回false。该文件夹是否受管理员权限保护?我的安装脚本无管理员权限,且希望保持此状态。请问有无办法仍能检测该文件是否存在?我已尝试IfFileExists命令,结果相同;尝试${DisableX64FSRedirection}却无法编译,报错“Invalid command: "${DisableX64FSRedirection}"”。
代码片段:
Function DetectDLL ${If} ${FileExists} "C:\Windows\System32\vcruntime140_1.dll" MessageBox MB_OK "File found." ${Else} MessageBox MB_OK "File not found." ${EndIf} FunctionEnd
问题核心原因
不是管理员权限的问题,而是WOW64文件系统重定向:32位NSIS脚本访问C:\Windows\System32时,会被系统自动重定向到C:\Windows\SysWOW64(存放32位系统文件的目录)。如果目标DLL是64位版本,自然会检测失败。普通用户对System32有读取权限,权限不是障碍。
解决方案一:修复${DisableX64FSRedirection}编译报错
${DisableX64FSRedirection}是x64.nsh头文件提供的宏,必须先引入头文件才能使用:
!include "x64.nsh"
修改后的检测函数:
Function DetectDLL ${DisableX64FSRedirection} ; 禁用重定向,访问真实的System32 ${If} ${FileExists} "C:\Windows\System32\vcruntime140_1.dll" MessageBox MB_OK "File found." ${Else} MessageBox MB_OK "File not found." ${EndIf} ${EnableX64FSRedirection} ; 检测完成后恢复重定向,避免影响后续逻辑 FunctionEnd
解决方案二:直接使用SysNative虚拟路径
无需修改重定向设置,32位程序可通过C:\Windows\SysNative直接访问真实的64位System32目录:
Function DetectDLL ${If} ${FileExists} "C:\Windows\SysNative\vcruntime140_1.dll" MessageBox MB_OK "File found." ${Else} MessageBox MB_OK "File not found." ${EndIf} FunctionEnd
SysNative是系统内置的虚拟路径,仅32位进程可见,无需额外权限即可访问。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

