Windows10运行npm run脚本报组策略错误如何排查解决
这个问题的核心特征很明确:直接执行目标命令正常、管理员权限下执行npm脚本正常、非管理员通过npm调用任意脚本都被组策略拦截,且安装Anaconda时出现同类报错,本质是Windows系统的应用控制规则拦截了非提权场景下npm生成的中转脚本进程,和npm、Angular CLI本身无关。
第一步:先定位具体被拦截的对象
不要盲目翻组策略配置,先查系统拦截日志直接定位根因:
- 按
Win+R输入eventvwr.msc回车打开事件查看器 - 依次展开路径:
应用程序和服务日志 > Microsoft > Windows > CodeIntegrity > 操作,同时查看Windows日志 > 安全分类,筛选报错时间点、来源为AppLocker或Software Restriction Policies的错误/警告事件 - 事件详情会明确标注被拦截的程序完整路径、触发的规则ID,绝大多数同类问题在这里就能直接看到被拦截的是npm临时目录下的
.cmd脚本,或是npm全局目录下的命令中转文件。
第二步:对应常见原因修复
1. 软件限制策略/AppLocker规则拦截用户目录脚本
不管是域环境下发的规则,还是之前装安全软件自动添加的本地规则,很多都会默认限制%APPDATA%\npm、用户临时目录%TEMP%下的可执行文件、脚本运行。npm在非管理员权限下执行脚本时,会先生成临时cmd脚本存到用户临时目录,调用全局安装的包时也会先走%APPDATA%\npm下的cmd中转文件,刚好命中拦截规则;直接在终端敲ng serve时是shell直接解析到对应程序的exe路径,不走临时脚本中转流程,所以不会触发拦截。
对应处理方式:
- 个人设备可打开本地组策略编辑器(
gpedit.msc),依次进入计算机配置 > Windows 设置 > 安全设置,分别检查应用控制策略 > AppLocker和软件限制策略项,把npm全局目录、用户临时目录对应的拦截规则调整为允许 - 不想修改全局策略的话,可以直接把npm的全局安装路径、缓存路径改到不在拦截范围内的非用户目录,比如
C:\npm-global、C:\npm-cache,执行以下命令配置:
npm config set prefix "C:\npm-global" npm config set cache "C:\npm-cache"
配置完成后把C:\npm-global添加到系统环境变量的Path列表里,重启终端生效。
2. 系统/第三方安全软件的应用控制拦截
如果在本地组策略里找不到对应规则,大概率是Windows Defender应用控制(WDAC)或是第三方安全软件的规则在生效:
- 先临时退出第三方安全软件,关闭脚本拦截、勒索软件防护类功能,测试问题是否复现
- 打开Windows安全中心,进入
设备安全性 > 内核隔离详细信息,临时关闭内存完整性功能测试,部分系统版本的WDAC规则在该功能开启时会误拦npm生成的未签名临时脚本 - 之前安装Anaconda也触发同类报错,基本可以确认是全局生效的未签名程序/脚本拦截规则导致的,不是单个软件的配置问题。
3. npm脚本执行shell配置异常
先检查npm默认调用的脚本执行shell是否被篡改:
npm config get script-shell
如果返回值不是系统默认的cmd.exe或powershell.exe,执行以下命令改回默认即可:
npm config set script-shell cmd
验证方式
所有配置修改完成后,用普通用户权限(不要右键选管理员身份)打开PowerShell,进入项目目录执行npm run start,能正常启动构建流程就说明问题解决。
内容的提问来源于stack exchange,提问作者Kevin Dufendach

