You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:42:21