Problem entry · machine-readable · 编码代理与终端

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

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idexecpolicy-restricted收录2026-08-29
问题域编码代理与终端主题分组权限与安全
适用工具powershell · 外部工具

症状

运行 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 干扰。

2. **当前会话级**(关掉窗口即恢复):

```

Set-ExecutionPolicy -Scope Process RemoteSigned

.\setup.ps1

```

3. **用户级持久**(影响当前用户全部会话):

```

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

Get-ExecutionPolicy -List # 确认 CurrentUser 行已变化

```

4. **企业/组策略锁定(MachinePolicy 非 Undefined)时**:用户级命令无效,需要管理员在组策略里放开,或找管理员申请例外;不要在本地硬改注册表对抗策略。

5. **下载的脚本被 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)

来源与证据

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

验证证据:Evidence details kept locally (2026-08-29)