安全修复 Conda PowerShell 配置文件的 PSSecurityException

维护版,核对于 2026-09-01。 2019 年原文通过把当前用户的执行策略设为 Unrestricted 修好了一台机器,但这通常比问题所需的范围更宽。下面先在不加载配置文件的情况下恢复 shell,再确认生效策略与准确配置文件,审查 Conda 准备写入的内容,最后选择授权范围内最窄的修复。文末完整保存 2019 年导出,仅规范化不可见的行尾空格。

PowerShell 启动时点执行 profile.ps1 并抛出 PSSecurityException,表示 PowerShell 启动策略层失败;它本身不能证明 Conda、Python 或某个环境已损坏。应把被阻止的配置文件、Conda 安装和目标环境分层处理。

1. 改策略前先读清报错路径

历史报错指向:

C:UsersuserDocumentsWindowsPowerShellprofile.ps1

这是 Windows PowerShell 的配置文件路径。PowerShell 7(pwsh.exe)、Windows PowerShell(powershell.exe)、Visual Studio Code 和其他宿主可能使用不同路径。Microsoft 建议在实际报错的宿主中读取 $PROFILE 自动变量,而不是假定一个固定文件。

执行策略是 Windows 针对配置文件与脚本的安全功能,但不是完整的安全边界。正确问题不是“怎样禁用它”,而是“哪个作用域正在生效、哪个文件被阻止、该文件是否可信”。

2. 不加载配置文件,先恢复干净 shell

从“命令提示符”、“运行”窗口或可信的 Conda prompt 启动同一类 PowerShell,并禁用配置文件:

powershell.exe -NoProfile
pwsh.exe -NoProfile

只运行与你所用宿主对应的命令。-NoProfile 是恢复模式:它不加载故障启动文件,但不会修改该文件或执行策略。若两个命令都找不到 conda,后续 Conda 命令应在该发行版安装的 Anaconda/Miniconda/Miniforge prompt 中执行。

不要只为消除报错就删除配置文件。它可能还包含无关的自定义内容,而且失败的宿主和路径本身就是重要证据。

3. 盘点宿主、配置文件、命令与策略

在干净的 PowerShell 会话中记录:

$PSVersionTable.PSVersion
$PSHOME
$PROFILE | Select-Object *

Get-ExecutionPolicy
Get-ExecutionPolicy -List
Get-Command conda -All -ErrorAction SilentlyContinue

不带作用域的 Get-ExecutionPolicy 显示实际生效策略;-List 列出 MachinePolicyUserPolicyProcessCurrentUserLocalMachine。组策略作用域优先于本地可配置作用域,因此 Set-ExecutionPolicy 即使执行成功,也可能没有改变实际策略。

应保存输出,而不是凭记忆中的默认值判断。Microsoft 记录了多种默认与生效组合,企业策略也可能有意禁止配置文件。

4. 检查准确配置文件和 Conda 改动

执行配置文件前,先把当前宿主的文件当作文本读取:

if (Test-Path -LiteralPath $PROFILE -PathType Leaf) {
    Get-Item -LiteralPath $PROFILE
    Get-Content -LiteralPath $PROFILE
}

Conda 初始化块应指向你预期的安装位置。块外的命令也必须审查;修复 Conda 不能顺带授权一个无关的配置文件载荷。

在能找到预期 conda 命令的 prompt 中预览当前版本准备进行的修改:

conda --version
conda init powershell --dry-run --verbose

Conda 文档说明 --dry-run 只显示而不写入。把预览与现有配置文件比较,并核对安装路径。不要粘贴从其他用户、机器或 Conda 版本复制来的初始化块。

5. 选择授权范围内最窄的修复

情况修复边界
MachinePolicyUserPolicy 已定义遵循组织策略或联系管理员不要用 CurrentUserProcessBypass 或复制来的代码试图绕过组策略。
个人非托管 Windows;已审查本地配置;策略为 Restricted可考虑将 CurrentUser 设为 RemoteSigned对当前用户持久生效,不影响整机;运行脚本前仍需审查。
RemoteSigned 阻止一个已审查且带下载标记的文件验证准确文件,只移除它的 Internet 区域标记不要递归解锁目录,也不要把“有签名”等同于“无恶意”。
策略必须保持不变使用可信 Conda prompt 与 conda runPowerShell 不自动激活;每条命令明确选择环境。
配置文件含有过时或不需要的 Conda 块预览并运行 conda init --reverse powershell只移除 Conda 初始化,不修复其他配置代码。

在个人非托管机器上且已审查配置文件后,下面的限定作用域命令通常可替代存档中的 Unrestricted

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-ExecutionPolicy
Get-ExecutionPolicy -List

RemoteSigned 允许运行本地创建的脚本;下载脚本必须签名,除非用户明确解除阻止。不要仅为初始化 Conda 就持久设置 UnrestrictedBypass。组织也可能正确要求 AllSigned,本文不会削弱它。

6. 只解锁一个已验证的下载文件

只有在生效策略已是 RemoteSigned,且报错明确指出一个可信文件带有 Internet 区域标记时才使用此路径。把占位符换成 PowerShell 报告的准确路径:

$blockedPath = 'C:pathreportedbytheerror.ps1'

Get-AuthenticodeSignature -LiteralPath $blockedPath |
    Format-List Status, StatusMessage, SignerCertificate
Get-Item -LiteralPath $blockedPath -Stream *
Unblock-File -LiteralPath $blockedPath -WhatIf

验证发布者与来源,检查文件内容,并确认路径位于预期安装中。仅当这些检查都通过时才运行:

Unblock-File -LiteralPath $blockedPath

Microsoft 说明 Unblock-File 会删除 Zone.Identifier 数据流。这是一次信任决定,不是通用的“清除报错”命令。不要递归解锁 Downloads、整个 Conda 安装或配置文件树。

7. 备份、初始化、重启并验证

让 Conda 修改非空配置文件前,先在旁边建立带时间戳的备份:

if (Test-Path -LiteralPath $PROFILE -PathType Leaf) {
    $stamp = Get-Date -Format 'yyyyMMdd-HHmmss'
    Copy-Item -LiteralPath $PROFILE -Destination "$PROFILE.$stamp.bak"
}

conda init powershell --dry-run --verbose
conda init powershell

关闭该 PowerShell 宿主的所有窗口,再启动一个新窗口;Conda 文档说明 conda init 后多数 shell 需要重启。随后验证命令、环境选择与解释器身份:

conda --version
conda info --envs
conda activate PROJECT_ENV
python -c "import sys; print(sys.executable); print(sys.version)"
conda deactivate

PROJECT_ENV 替换为目标环境。仅看到 prompt 前缀还不算验收;sys.executable 必须位于预期前缀中。

8. 不做持久 PowerShell 初始化也能运行任务

自动激活不是必需条件。在可信 Conda prompt 中,conda run 可以不加载 PowerShell 配置文件,直接在指定环境运行一条命令:

conda run --name PROJECT_ENV --no-capture-output -- python .script.py

Conda 为这条边界记录了 --name/--prefix--cwd--no-capture-output。对于计划任务和可复现自动化,显式执行往往比依赖交互式配置文件更清晰。进程仍继承调用者的文件、网络权限与凭据;Conda 环境用于依赖隔离,不是安全沙箱。

9. 回滚 Conda 配置文件改动

先预览受支持的逆操作:

conda init --reverse powershell --dry-run --verbose
conda init --reverse powershell

重启 shell 后再次检查 $PROFILE。若无关内容被改动,或逆操作结果与记录的预览不符,应停止并比较时间戳备份,不要盲目覆盖配置文件。

若本文修改了 CurrentUser 策略且现在不再需要,先记录当前列表,再只删除这一作用域的设置:

Get-ExecutionPolicy -List
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
Get-ExecutionPolicy -List

Undefined 表示删除该作用域的设置;之后的生效策略来自下一个适用作用域,并不保证一定是 Restricted 或任何特定值。

10. 按观察到的层次排错

观察可能原因下一步证据
启动时 PSSecurityException 指向 profile.ps1生效策略阻止该宿主的配置文件$PROFILEGet-ExecutionPolicy -List、文件内容
设置 CurrentUser 成功但生效策略不变更高优先级组策略MachinePolicyUserPolicy 与管理员指引
只有使用 -NoProfile 时找不到 conda配置文件提供了 shell 函数或 PATH使用可信 Conda prompt;检查 Get-Command conda -All
conda activate 提示 shell 未配置初始化缺失、已逆转或应用到了另一宿主/配置文件宿主程序、$PROFILEconda init ... --dry-run --verbose
初始化路径指向旧安装重装或移动后残留旧配置块比较 Get-Command conda、预览与配置备份
Conda 已激活但 Python 不对环境选错或可执行文件被遮蔽conda info --envsGet-Command python -Allsys.executable
RemoteSigned 下只有一个下载模块被拒绝Internet 区域标记或无效签名准确报错路径、签名、备用数据流、来源

在表中没有找到相应证据前,不要重装 Anaconda、编辑注册表、删除所有配置文件或放宽策略。

11. 安全与自动化说明

  • 把 PowerShell 配置文件视为可执行代码;安装程序修改后应审查 diff。
  • 不要把秘密放入配置文件或命令历史;激活环境不会保护秘密。
  • 在托管环境中保留组策略,使用获批签名配置或显式命令。
  • 自动化应固定环境、打印 sys.executable、记录退出状态,并避免依赖用户的交互配置文件。
  • 只有项目确实支持两者时才同时测试 Windows PowerShell 与 PowerShell 7;二者的配置路径和模块环境可能不同。
  • 执行策略可减少意外运行脚本,但 Microsoft 明确说明它不是阻止有意运行代码的安全系统。

12. 完整的 2019 年导出存档

下面是完整的 2019 WordPress 导出。原来的 Unrestricted 修复仅作为历史来源保存,不是当前建议。只为仓库格式规范化了不可见的行尾空格。

---
id: 1982
title: 'Run Anaconda Script in Powershell to Error'
slug: 'run-anaconda-script-in-powershell-to-error'
date: '2019-07-05T06:56:14'
modified: '2019-07-05T06:56:17'
status: 'publish'
link: 'https://blog.lazying.art/en/html/computer_internet/software/1982/run-anaconda-script-in-powershell-to-error.html'
author: 'Lachlan Chen'
categories:
  - 'Software'
---

I met this error when open Powershell

+ . <<<< 'C:UsersuserDocumentsWindowsPowerShellprofile.ps1'
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException


after running

conda init powershell


It get solved by execute this in Powershell

Set-ExecutionPolicy Unrestricted -Scope CurrentUser

一手文档

Leave a Reply