快速修复
# 一键:进程级临时绕过(最推荐,不写注册表)
powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1
只对当前进程生效,不改任何持久设置;-NoProfile 避免用户 profile 干扰。
你会遇到什么
运行 PowerShell 脚本直接失败:File C:\path\setup.ps1 cannot be loaded because running scripts is disabled on this system.(中文系统:无法加载文件...因为在此系统上禁止运行脚本)。交互式命令(Get-Process 等)正常,只有「执行脚本文件」被拦。
常见触发:Windows 客户端默认 Restricted、企业组策略锁定、或下载的脚本带 MOTW 标记被 RemoteSigned 拦。
本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。
为什么会这样
| 要点 | 说明 |
|---|---|
| 执行策略分层 | MachinePolicy → UserPolicy → Process → CurrentUser → LocalMachine,前面的层优先级更高 |
-File 不绕过策略 | powershell -File xxx.ps1 依然受执行策略约束——很多人以为带 -File 就能跑 |
| RemoteSigned 语义 | 本地未签名脚本可跑;从互联网下载的脚本带 Zone.Identifier(MOTW)标记,无签名被拦 |
| 改动不生效的坑 | Set-ExecutionPolicy RemoteSigned 默认只改 CurrentUser;企业策略非 Undefined 时用户层改了也没用 |
PowerShell 执行策略是分层叠加:MachinePolicy → UserPolicy → Process → CurrentUser → LocalMachine,前面层优先。
powershell -File xxx.ps1 不绕过策略(很多人以为带 -File 就能跑);RemoteSigned 下「从互联网下载」的脚本带 Zone.Identifier(MOTW 标记),无签名被拦——本地创建的脚本不受影响。
两个「改了不生效」的坑:Set-ExecutionPolicy RemoteSigned 默认只改 CurrentUser(LocalMachine 需要管理员且策略非 Undefined 时用户层无效);企业策略(MachinePolicy/UserPolicy)非 Undefined 时,用户层设置全部被压过。
确定性推论:Get-ExecutionPolicy -List 看完整分层,找到哪层是实际生效值;「下载的脚本被拦」 = 解除 MOTW(Unblock-File)而不是关策略;改不生效 = 看是不是被更高层策略压住;判断路径:先查 -List 再动手。
一步步来
1. 进程级临时绕过 — 必做
powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1
2. 当前会话级 — 必做
Set-ExecutionPolicy -Scope Process RemoteSigned
.\setup.ps1
关掉窗口即恢复。
3. 用户级持久 — 必做
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Get-ExecutionPolicy -List
影响当前用户全部会话;确认 CurrentUser 行已变化。
4. 企业/组策略锁定 — 必做
MachinePolicy 非 Undefined 时用户级命令无效,需要管理员在组策略里放开,或申请例外;不要在本地硬改注册表对抗策略。
5. 下载的脚本被 RemoteSigned 拦 — 必做
Unblock-File .\downloaded.ps1
去掉 MOTW 标记(仅当信任来源)。
怎么确认修好了
脚本正常执行(实测输出形态):
powershell -ExecutionPolicy Bypass -File payload.ps1 → 正常输出,exit=0
检查当前策略与分层:Get-ExecutionPolicy -List;查 MOTW:Get-Content -Stream Zone.Identifier .\x.ps1。
其它环境的表现
| 环境 | 说明 |
|---|---|
| Restricted | 禁止任何脚本文件(含本地文件) |
| RemoteSigned | 本地可跑;下载脚本需 Unblock-File 或签名 |
| 企业策略 | 用户级命令无效,走组策略 |
| -File 参数 | 不绕过策略(实测受限时同样报错) |
| 未完整复现项 | 手动写 Zone.Identifier 后本机未拦截(MOTW 缓存/环境差异),机制以官方文档为准 |
症状
运行 PowerShell 脚本直接失败,报错类似:
powershell -File .\setup.ps1
File C:\path\setup.ps1 cannot be loaded because running scripts is disabled on this system.
(中文系统:无法加载文件 ...,因为在此系统上禁止运行脚本。)
+ CategoryInfo : SecurityError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess
- 在 PowerShell 提示符里直接
.\script.ps1或& .\script.ps1也可能报同一错误。 - 交互式命令(
Get-Process、Set-Location等)正常,只有「执行脚本文件」被拦。 - 常见触发:Windows 客户端默认
Restricted;或企业组策略把 MachinePolicy 锁成Restricted/AllSigned;或从网上下载的脚本带「来自 Internet」标记(Zone.Identifier)在RemoteSigned下无签名被拦。
原因
- 执行策略分层:
MachinePolicy→UserPolicy→Process→CurrentUser→LocalMachine,前面的层优先级更高,Get-ExecutionPolicy -List可见全部分层;Restricted= 禁止任何脚本文件(含本地文件)。 -File参数不绕过策略:powershell -File xxx.ps1依然受执行策略约束——很多人以为带-File就能跑,实际不行。- RemoteSigned 语义:本地创建的未签名脚本可以跑;但从互联网下载的脚本带 Zone.Identifier(MOTW)标记,无数字签名时被拦——这是「下载的脚本跑不了」的常见原因。
- 改动不生效的常见坑:
Set-ExecutionPolicy RemoteSigned默认只改CurrentUser,若企业策略(MachinePolicy/UserPolicy)非 Undefined,改用户层不生效;或改了 LocalMachine 但无管理员权限报错。
解法
按「不改系统 → 会话级 → 用户级 → 企业级」顺序选:
- 进程级临时绕过(最推荐,不写注册表):
powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1
只对当前进程生效,不改任何持久设置;-NoProfile 避免用户 profile 干扰。
- 当前会话级(关掉窗口即恢复):
Set-ExecutionPolicy -Scope Process RemoteSigned
.\setup.ps1
- 用户级持久(影响当前用户全部会话):
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Get-ExecutionPolicy -List # 确认 CurrentUser 行已变化
- 企业/组策略锁定(MachinePolicy 非 Undefined)时:用户级命令无效,需要管理员在组策略里放开,或找管理员申请例外;不要在本地硬改注册表对抗策略。
- 下载的脚本被 RemoteSigned 拦(报错带
UnauthorizedAccess+ 文件来源是浏览器下载):用Unblock-File去掉 MOTW 标记(仅当信任来源):
Unblock-File .\downloaded.ps1
检查当前策略与分层:Get-ExecutionPolicy -List;查看某文件是否带 MOTW:Get-Item .\x.ps1 | Select-Object -ExpandProperty VersionInfo 或 Get-Content -Stream Zone.Identifier .\x.ps1。
验证证据
- 本机基线(Windows PowerShell 5.1,2026-08-29):
CurrentUser = RemoteSigned。 - 实测 1(症状复现):进程级
Restricted+-File payload.ps1→ 报running scripts is disabled on this system(SecurityError/UnauthorizedAccess),exit=1——与用户报错逐字一致。 - 实测 2(修复 1):
-ExecutionPolicy Bypass -File→ 脚本正常输出,exit=0。 - 实测 3(RemoteSigned 语义):本地未签名脚本在
RemoteSigned下可运行,exit=0。 - 实测 4(如实标注):手动写入 Zone.Identifier(ZoneId=3)模拟远程下载后,本机
RemoteSigned未拦截(MOTW 缓存/环境差异)——「下载脚本被拦」场景未在本环境完整复现,机制与修复命令以官方文档为准。 - 实测复现日志(2026-08-29)
适用工具 (1)
本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。
powershell · 外部工具成套方案 (组合包)
这个问题包含在下列成套安装方案中。
来源与证据
← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡