元数据
| id | execpolicy-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)
来源与证据
验证证据:Evidence details kept locally (2026-08-29)