在使用python虚拟环境的时候,使用power shell 激活虚拟环境的过程中,出现报错:
报错信息
无法加载文件 *.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
解决方案
- 管理员打开PowerShell
- 执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
如下图:
运行后,再次激活python虚拟环境,就可以正常激活,不会报错了。
官方文档内容(既报错链接内容)
关于执行策略(about_Execution_Policies) – PowerShell | Microsoft Docs
about_Execution_Policies
简短说明
介绍 PowerShell 执行策略并说明如何管理它们。
长说明
PowerShell 执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶意脚本的执行。
在Windows计算机上,你可以为本地计算机、当前用户或特定会话设置执行策略。 还可使用组策略设置为计算机和用户设置执行策略。
本地计算机和当前用户的执行策略存储在注册表中。 无需在 PowerShell 配置文件中设置执行策略。 特定会话的执行策略仅存储在内存中,在关闭会话时将丢失。
执行策略不是限制用户操作的安全系统。 例如,当用户无法运行脚本时,可以通过在命令行中键入脚本内容来轻松绕过策略。 相反,执行策略可帮助用户设置基本规则,并防止用户无意中违反这些规则。
在非Windows计算机上,默认执行策略为 Unrestricted 且无法更改。 cmdlet Set-ExecutionPolicy
可用,但 PowerShell 显示一条控制台消息,指出它不受支持。 虽然 Get-ExecutionPolicy
在 Unrestricted 非 Windows Bypass 平台上返回 ,但行为确实匹配,因为这些平台不实现Windows 安全中心区域。
PowerShell 执行策略
这些策略仅在其他平台上Windows实施。 PowerShell 执行策略如下所示:
AllSigned
- 脚本可以运行。
- 要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。
- 在从尚未分类为受信任或不受信任的发布者运行脚本之前,提示你。
- 运行已签名但恶意的脚本的风险。
Bypass
- 不阻止任何操作,并且没有任何警告或提示。
- 此执行策略适用于将 PowerShell 脚本内置到较大应用程序中的配置,或用于 PowerShell 是具有其自己的安全模型的程序基础的配置。
Default
- 设置默认执行策略。
- Restricted 对于 Windows 客户端。
- RemoteSigned Windows服务器。
RemoteSigned
- 服务器计算机的默认Windows策略。
- 脚本可以运行。
- 需要受信任的发布者对从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序)进行数字签名。
- 对于在本地计算机上编写且未从 Internet 下载的脚本,不需要数字签名。
- 如果脚本未受阻止(例如使用 cmdlet),则运行从 Internet
Unblock-File
下载且未签名的脚本。 - 从 Internet 来源(而不是 Internet)运行未签名脚本的风险,以及可能是恶意的已签名脚本的风险。
Restricted
- 客户端计算机的默认Windows策略。
- 允许单个命令,但不允许脚本。
- 阻止运行
.ps1xml
.psm1
所有脚本文件,包括格式化和配置文件 () 、模块脚本文件 () 和 PowerShell 配置文件 ().ps1
。
Undefined
- 当前作用域中未设置执行策略。
- 如果所有作用域中的执行策略 Undefined 都是 ,Restricted 则有效执行策略适用于 Windows 客户端,RemoteSigned 适用于 Windows 服务器。
Unrestricted
- 非计算机的默认执行Windows无法更改。
- 未签名的脚本可以运行。 存在运行恶意脚本的风险。
- 在运行不是来自本地 Intranet 区域中的脚本和配置文件之前,警告用户。
备注
在未区分通用命名约定 (UNC) 路径与 Internet 路径的系统上,可能不允许 UNC 路径标识的脚本使用 RemoteSigned 执行策略运行。
执行策略范围
可以设置仅在特定范围内有效的执行策略。
的有效值为 Scope 、MachinePolicy****UserPolicy、Process****CurrentUser 和 LocalMachine。 LocalMachine 是设置执行策略时的默认选项。
这些值 Scope 按优先顺序列出。 优先的策略在当前会话中有效,即使设置了限制性更强、优先级较低的策略。
有关详细信息,请参阅 Set-ExecutionPolicy。
MachinePolicy
由 组策略计算机的所有用户设置。
UserPolicy
由 组策略当前用户的设置。
Process
范围 Process 仅影响当前 PowerShell 会话。 执行策略保存在环境变量 中 $env:PSExecutionPolicyPreference
,而不是注册表中。 关闭 PowerShell 会话后,将删除变量和值。
CurrentUser
执行策略仅影响当前用户。 它存储在注册表 HKEY_CURRENT_USER项中 。
LocalMachine
执行策略会影响当前计算机上所有用户。 它存储在注册表 HKEY_LOCAL_MACHINE项中 。
使用 PowerShell 管理执行策略
若要获取当前 PowerShell 会话的有效执行策略,请使用 Get-ExecutionPolicy
cmdlet。
以下命令获取有效执行策略:
Get-ExecutionPolicy
若要获取影响当前会话的所有执行策略,并按优先顺序显示这些策略,请执行以下命令:
Get-ExecutionPolicy -List
结果类似于以下示例输出:Output
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine AllSigned
在这种情况下,有效执行策略为 RemoteSigned ,因为当前用户的执行策略优先于为本地计算机设置的执行策略。
若要获取特定范围的执行策略集,请使用 Scope 的 参数 Get-ExecutionPolicy
。
例如,以下命令获取 CurrentUser 范围的执行 策略:
Get-ExecutionPolicy -Scope CurrentUser
更改执行策略
若要更改计算机上 PowerShell 执行Windows,请使用 Set-ExecutionPolicy
cmdlet。 更改会立即生效。 无需重启 PowerShell。
如果为 范围 LocalMachine 或 CurrentUser 设置执行策略,则更改将保存在注册表中,并一直有效,直到再次更改它。
如果为范围设置执行策略 Process ,该策略不会保存在注册表中。 将保留执行策略,直到当前进程和任何子进程关闭。
备注
在 Windows Vista 及更高版本的 Windows 中,若要运行更改本地计算机 LocalMachine 范围的执行策略的命令,请通过”以管理员方式运行”选项启动 PowerShell。
更改执行策略:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
设置特定作用域中的执行策略:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
更改执行策略的命令可以成功,但仍不能更改有效执行策略。
例如,为本地计算机设置执行策略的命令可以成功,但被当前用户的执行策略重写。
删除执行策略
若要删除特定范围的执行策略,将执行策略设置为 Undefined。
例如,若要删除本地计算机的所有用户的执行策略,请执行以下命令:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
删除 的执行策略 Scope:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
如果在任何作用域中未设置执行策略,则有效 Restricted 执行策略为 ,这是客户端Windows策略。
为一个会话设置不同的策略
可以使用 的 ExecutionPolicy 参数 pwsh.exe
为新的 PowerShell 会话设置执行策略。 策略仅影响当前会话和子会话。
若要设置新会话的执行策略,请从命令行(如 PowerShell 或 PowerShell)启动 PowerShell cmd.exe
,然后使用 的 ExecutionPolicy pwsh.exe
参数设置执行策略。
例如:
pwsh.exe -ExecutionPolicy AllSigned
你设置的执行策略未存储在注册表中。 相反,它存储在环境变量中 $env:PSExecutionPolicyPreference
。 关闭设置了策略的会话时,将删除该变量。 不能通过编辑变量值来更改策略。
在会话期间,为会话设置的执行策略优先于在注册表中为本地计算机或当前用户设置的执行策略。 但是,它不会优先于通过使用组策略设置的执行策略。
使用组策略来管理执行策略
您可以使用 ” 打开脚本执行 组策略” 设置来管理企业中的计算机的执行策略。 组策略设置将替代在所有作用域中在 PowerShell 中设置的执行策略。
” 打开脚本执行 ” 策略设置如下所示:
- 如果禁用 ” 启用脚本执行“,脚本将不会运行。 这等效 Restricted 于执行策略。
- 如果启用 “启用 脚本执行“,则可以选择执行策略。 组策略设置等效于以下执行策略设置:组策略执行策略允许所有脚本Unrestricted允许本地脚本和远程签名的脚本RemoteSigned仅允许签名脚本AllSigned
- 如果未配置 ” 启用脚本执行 “,则它不起作用。 在 PowerShell 中设置的执行策略是有效的。
PowerShellExecutionPolicy 和 PowerShellExecutionPolicy 文件将 打开脚本执行 策略添加到组策略编辑器中的 “计算机配置” 和 “用户配置” 节点,路径如下。
对于 Windows XP 和 Windows Server 2003:
Administrative Templates\Windows Components\Windows PowerShell
对于 Windows Windows Vista 和更高版本:
Administrative Templates\Classic Administrative Templates\Windows Components\Windows PowerShell
“计算机配置” 节点中设置的策略优先于 “用户配置” 节点中设置的策略。
有关详细信息,请参阅 about_Group_Policy_Settings。
执行策略优先级
在确定会话的有效执行策略时,PowerShell 将按以下优先顺序评估执行策略:复制
Group Policy: MachinePolicy
Group Policy: UserPolicy
Execution Policy: Process (or pwsh.exe -ExecutionPolicy)
Execution Policy: CurrentUser
Execution Policy: LocalMachine
管理签名和未签名的脚本
在 Windows 中,Internet Explorer 和 Microsoft Edge 等程序将备用数据流添加到下载的文件中。 这会将该文件标记为 “来自 Internet”。 如果 PowerShell 执行策略是 RemoteSigned,则 powershell 不会运行从 internet 下载的未签名脚本,其中包括电子邮件和即时消息程序。
你可以对脚本进行签名,或选择运行未签名的脚本,而无需更改执行策略。
从 PowerShell 3.0 开始,可以使用 cmdlet 的 Stream 参数 Get-Item
来检测因从 internet 下载而被阻止的文件。 Unblock-File
使用 cmdlet 取消阻止脚本,以便可以在 PowerShell 中运行它们。
有关详细信息,请参阅 about_Signing、 获取项和 取消阻止文件。
备注
下载文件的其他方法可能不会将文件标记为来自 Internet 区域。 示例包括:
curl.exe
Invoke-RestMethod
Invoke-WebRequest
Windows Server Core 和 Window Nano server 上的执行策略
如果在某些情况下 Windows Server Core 或 Windows Nano server 上运行 PowerShell 6,则执行策略可能会失败,并出现以下错误:Output
AuthorizationManager check failed.
At line:1 char:1
+ C:\scriptpath\scriptname.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PowerShell 使用 Windows 桌面 Shell 中的 api (explorer.exe
) 来验证脚本文件的区域。 Windows Shell 在 Windows Server Core 和 Windows Nano server 上不可用。
如果 Windows 桌面 Shell 不可用或无响应,也可能会在任何 Windows 系统上收到此错误。 例如,在登录过程中,PowerShell 登录脚本可以在 Windows 桌面准备就绪之前开始执行,从而导致失败。
使用 绕过 或 AllSigned 的执行策略不需要区域检查来避免此问题。
请参阅
- about_Environment_Variables
- about_Group_Policy_Settings
- about_Pwsh
- about_Signing
- Get-ExecutionPolicy
- Set-ExecutionPolicy
- Get-Item
- Unblock-File
建议的内容
- PowerShell 7.0 中的新增功能 – PowerShellPowerShell 7.0 中发布的新功能和更改
- Windows PowerShell 5.1 和 PowerShell 7.x 之间的差异 – PowerShell本文总结了 Windows PowerShell 5.1 与当前基于 .NET Core 的 PowerShell 版本之间的差异和重大更改。
- 如何在 Windows PowerShell ISE 中使用配置文件 – PowerShell本文介绍如何在 Windows PowerShell ISE 中使用配置文件。
- 关于配置文件 – PowerShell介绍如何创建和使用 PowerShell 配置文件。
- 如何在 Windows PowerShell ISE 中创建 PowerShell 选项卡 – PowerShell使用 Windows PowerShell 集成脚本环境 (ISE) 中的选项卡,可在相同的应用程序中同时创建并使用多个执行环境。 每个 PowerShell 选项卡对应于单独的执行环境或会话。
- 在 Windows 上安装 PowerShell – PowerShell介绍如何在 Windows 上安装 PowerShell