编码代理与终端 · 收录于 2026-08-29 · 适用 1 工具 ✓ 实测验证

powershell 运行 .ps1 报「禁止运行脚本」——执行策略(ExecutionPolicy)限制

已验证 2026-08-29PowerShell 禁止运行脚本——进程级绕过最推荐:powershell -NoProfile -ExecutionPolicy Bypass -File script.ps1,不改注册表。

快速修复

# 一键:进程级临时绕过(最推荐,不写注册表)
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 下无签名被拦。

原因

  1. 执行策略分层:MachinePolicy → UserPolicy → Process → CurrentUser → LocalMachine,前面的层优先级更高,Get-ExecutionPolicy -List 可见全部分层;Restricted = 禁止任何脚本文件(含本地文件)。
  2. -File 参数不绕过策略:powershell -File xxx.ps1 依然受执行策略约束——很多人以为带 -File 就能跑,实际不行。
  3. RemoteSigned 语义:本地创建的未签名脚本可以跑;但从互联网下载的脚本带 Zone.Identifier(MOTW)标记,无数字签名时被拦——这是「下载的脚本跑不了」的常见原因。
  4. 改动不生效的常见坑:Set-ExecutionPolicy RemoteSigned 默认只改 CurrentUser,若企业策略(MachinePolicy/UserPolicy)非 Undefined,改用户层不生效;或改了 LocalMachine 但无管理员权限报错。

解法

按「不改系统 → 会话级 → 用户级 → 企业级」顺序选:

  1. 进程级临时绕过(最推荐,不写注册表):
   powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1

只对当前进程生效,不改任何持久设置;-NoProfile 避免用户 profile 干扰。

  1. 当前会话级(关掉窗口即恢复):
   Set-ExecutionPolicy -Scope Process RemoteSigned
   .\setup.ps1
  1. 用户级持久(影响当前用户全部会话):
   Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
   Get-ExecutionPolicy -List   # 确认 CurrentUser 行已变化
  1. 企业/组策略锁定(MachinePolicy 非 Undefined)时:用户级命令无效,需要管理员在组策略里放开,或找管理员申请例外;不要在本地硬改注册表对抗策略。
  1. 下载的脚本被 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 · 外部工具

成套方案 (组合包)

这个问题包含在下列成套安装方案中。

来源与证据

收录 验证 ✓ 实测验证适用 1 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

素材来源:https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_execution_policies

← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡