共用方式為


關於執行原則

簡短描述

描述 PowerShell 執行原則,並說明如何管理它們。

完整描述

PowerShell 的執行原則是一項安全功能,可控制 PowerShell 載入組態檔和執行腳本的條件。 此功能有助於防止執行惡意指令碼。

在 Windows 電腦上,您可以為本機電腦、目前使用者或特定工作階段設定執行原則。 您也可以使用群組原則設定來設定電腦和使用者的執行原則。

本機計算機和目前使用者的執行原則會儲存在登錄中。 您不需要在 PowerShell 設定檔中設定執行原則。 特定工作階段的執行原則只會儲存在記憶體中,並在工作階段關閉時遺失。

執行原則不是限制使用者動作的安全性系統。 例如,當使用者無法執行腳本時,可以在命令行輸入腳本內容,輕鬆地略過原則。 相反地,執行原則可協助用戶設定基本規則,並防止他們不小心違反這些規則。

在非 Windows 電腦上,預設執行原則為 [不受限制 ],且無法變更。 Cmdlet Set-ExecutionPolicy 可供使用,但 PowerShell 會顯示不支援的控制台訊息。 雖然Get-ExecutionPolicy在非 Windows 平臺上傳回 [不受限制],但行為實際上與略過相符,因為這些平臺不會實作 Windows 安全性 區域。

PowerShell 執行原則

這些原則的強制執行只會發生在 Windows 平臺上。 PowerShell 執行原則如下所示:

AllSigned

  • 腳本可以執行。
  • 要求所有指令碼與設定檔需由信任的發行者簽署,包括您在本機電腦上編寫的指令碼。
  • 在您尚未分類為受信任或未受信任的發行者執行腳本之前,提示您。
  • 執行已簽署但惡意腳本的風險。

旁路

  • 不會封鎖任何項目,且不會顯示警告或提示。
  • 此執行原則是針對PowerShell腳本內建至較大的應用程式或PowerShell是具有其安全性模型之程式基礎的組態所設計。

Default

  • 設定預設執行原則。
  • 受限 於 Windows 用戶端。
  • 適用於 Windows 伺服器的 RemoteSigned

RemoteSigned

  • Windows Server 計算機的預設執行原則。
  • 腳本可以執行。
  • 需要來自受信任發行者的數位簽名,這些腳本和組態檔是從因特網下載,其中包含電子郵件和立即傳訊程式。
  • 不需要在本機計算機上撰寫且未從因特網下載的腳本上使用數字簽名。
  • 如果腳本已解除封鎖,則執行從因特網下載且未簽署的腳本,例如使用 Unblock-File Cmdlet。
  • 從因特網以外的來源執行未簽署腳本的風險,以及可能為惡意的已簽署腳本。

受限制

  • Windows 用戶端電腦的預設執行原則。
  • 允許個別命令,但不允許腳本。
  • 防止執行所有腳本檔案,包括格式化和組態檔 () .ps1xml 、模組腳本檔案 (.psm1) ,以及 PowerShell .ps1 配置檔 () 。

未定義

  • 目前範圍內沒有設定執行原則。
  • 如果所有範圍中的執行原則為 Undefined,則有效的執行原則為 Restricted (適用於 Windows 用戶端) 和 RemoteSigned (適用於 Windows Server)。

不受限制

  • 非 Windows 計算機的預設執行原則,無法變更。
  • 未簽署的腳本可以執行。 執行惡意腳本的風險。
  • 在執行不是來自本機內部網路區域的腳本和組態檔之前,警告使用者。

注意

在無法區別通用命名慣例 (UNC) 路徑與因特網路徑的系統上,可能無法使用 RemoteSigned 執行原則來執行 UNC 路徑所識別的腳本。

執行原則範圍

您可以設定只在特定範圍內有效的執行原則。

Scope 的有效值為 MachinePolicy、UserPolicyProcessCurrentUserLocalMachine LocalMachine 是設定執行原則時的預設值。

[範圍] 值會依優先順序列出。 優先順序較高的原則在目前會話中有效,即使設定優先順序較低的原則也一樣。

如需詳細資訊,請參閱 Set-ExecutionPolicy

MachinePolicy

由電腦的所有用戶設定 群組原則。

UserPolicy

由電腦目前使用者的 群組原則 設定。

流程

進程範圍只會影響目前的PowerShell會話。 執行原則會儲存在環境變數 $env:PSExecutionPolicyPreference中,而不是登錄。 關閉 PowerShell 工作階段時,會刪除變數和值。

CurrentUser

執行原則只會影響目前的使用者。 它會儲存在 HKEY_CURRENT_USER登錄 子機碼中。

LocalMachine

執行原則會影響目前計算機上的所有使用者。 它會儲存在 HKEY_LOCAL_MACHINE登錄 子機碼中。

使用 PowerShell 管理執行原則

若要取得目前 PowerShell 會話的有效執行原則,請使用 Get-ExecutionPolicy Cmdlet。

下列命令會取得有效的執行原則:

Get-ExecutionPolicy

若要取得影響目前會話的所有執行原則,並依優先順序顯示:

Get-ExecutionPolicy -List

結果看起來類似下列範例輸出:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       AllSigned

在此情況下,有效的執行原則是 RemoteSigned ,因為目前使用者的執行原則優先於本機電腦所設定的執行原則。

若要取得特定範圍的執行原則集,請使用 的 Get-ExecutionPolicyScope 參數。

例如,下列命令會取得 CurrentUser 範圍的執行原則:

Get-ExecutionPolicy -Scope CurrentUser

變更執行原則

若要變更 Windows 電腦上的 PowerShell 執行原則,請使用 Set-ExecutionPolicy Cmdlet。 變更會立即生效。 您不需要重新啟動 PowerShell。

如果您設定 LocalMachineCurrentUser 範圍的執行原則,變更會儲存在登錄中,並維持有效狀態,直到您再次變更為止。

如果您設定 進程 範圍的執行原則,它就不會儲存在登錄中。 執行原則會保留,直到目前的進程和任何子進程關閉為止。

注意

在 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

變更執行原則的命令可以成功,但仍無法變更有效的執行原則。

例如,設定本機計算機的執行原則的命令可以成功,但由目前使用者的執行原則覆寫。

拿掉執行原則

若要移除特定範圍的執行原則,請將執行原則設定為 [未定義]。

例如,若要移除本機計算機所有使用者的執行原則:

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine

若要移除 範圍的執行原則:

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser

如果未在任何範圍內設定任何執行原則,則有效的執行原則為 Restricted,這是 Windows 用戶端的預設值。

為一個會話設定不同的原則

您可以使用 pwsh.exeExecutionPolicy 參數來設定新 PowerShell 會話的執行原則。 此原則只會影響目前的工作階段和子會話。

若要設定新會話的執行原則,請在命令行啟動PowerShell,例如 cmd.exe 或從PowerShell啟動PowerShell,然後使用 pwsh.exeExecutionPolicy 參數來設定執行原則。

例如:

pwsh.exe -ExecutionPolicy AllSigned

您設定的執行原則不會儲存在登錄中。 相反地,它會儲存在環境變數中 $env:PSExecutionPolicyPreference 。 當您關閉設定原則的會話時,就會刪除變數。 您無法編輯變數值來變更原則。

在工作階段期間,針對會話設定的執行原則優先於本機電腦或目前使用者登錄中設定的執行原則。 不過,它不會優先於使用 群組原則 所設定的執行原則。

使用群組原則管理執行原則

您可以使用 [開啟文稿執行 群組原則 設定來管理企業中計算機的執行原則。 群組原則設定會覆寫所有範圍內在 PowerShell 中設定的執行原則。

[開啟指令碼執行] 原則設定如下所示:

  • 如果停用 [開啟指令碼執行],指令碼就不會執行。 這相當於 受限制 的執行原則。

  • 如果啟用 [開啟指令碼執行],則可選取執行原則。 群組原則設定相當於下列執行原則設定:

    群組原則 執行原則
    允許所有指令碼 不受限制
    允許本機指令碼和遠端簽署的指令碼 RemoteSigned
    只允許簽署的指令碼 AllSigned
  • 如果未設定 [開啟指令碼執行],則不會有任何效果。 PowerShell 中設定的執行原則會發揮作用。

PowerShellExecutionPolicy.adm 和 PowerShellExecutionPolicy.admx 檔案會將 [開啟指令碼執行] 原則新增至下列路徑中群組原則編輯器的 [電腦設定] 和 [使用者設定] 節點。

若為 Windows XP 和 Windows Server 2003:

Administrative Templates\Windows Components\Windows PowerShell

若為 Windows Vista 和後續版本的 Windows:

系統管理範本\傳統系統管理範本
Windows 元件\Windows PowerShell

[電腦設定] 節點中設定的原則會優先於 [使用者設定] 節點中設定的原則。

如需詳細資訊,請參閱 about_Group_Policy_Settings

執行原則優先順序

判斷會話的有效執行原則時,PowerShell 會以下列優先順序評估執行原則:

  • 群組原則:MachinePolicy
  • 群組原則:UserPolicy
  • 執行原則:處理 (或 pwsh.exe -ExecutionPolicy)
  • 執行原則:CurrentUser
  • 執行原則:LocalMachine

管理已簽署和未簽署的腳本

在 Windows 中,Internet Explorer 和 Microsoft Edge 之類的程式會將替代數據流新增至下載的檔案。 這會將檔案標示為「來自因特網」。 如果您的PowerShell執行原則是 RemoteSigned,PowerShell將不會執行從因特網下載的未簽署腳本,其中包括電子郵件和立即訊息程式。

您可以簽署腳本,或選擇執行未簽署的腳本,而不需變更執行原則。

從 PowerShell 3.0 開始,您可以使用 Cmdlet 的 Get-ItemStream 參數來偵測因為從因特網下載而遭到封鎖的檔案。 Unblock-File使用 Cmdlet 解除封鎖文稿,以便您可以在 PowerShell 中執行這些腳本。

如需詳細資訊,請參閱 about_SigningGet-ItemUnblock-File

注意

下載檔的其他方法可能不會將檔案標示為來自因特網區域。 部分範例包括:

  • curl.exe
  • Invoke-RestMethod
  • Invoke-WebRequest

Windows Server Core 和 Window Nano Server 上的執行原則

在某些情況下,在 Windows Server Core 或 Windows Nano Server 上執行 PowerShell 6 時,執行原則可能會失敗,並出現下列錯誤:

AuthorizationManager check failed.
At line:1 char:1
+ C:\scriptpath\scriptname.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

PowerShell 會使用 Windows 桌面殼層中的 API () explorer.exe 來驗證腳本檔案的區域。 Windows Server Core 和 Windows Nano Server 上無法使用 Windows Shell。

如果 Windows 桌面殼層無法使用或沒有回應,您也可以在任何 Windows 系統上收到此錯誤。 例如,在登入期間,PowerShell 登入腳本可能會在 Windows Desktop 就緒之前開始執行,因而導致失敗。

使用 ByPassAllSigned 的執行原則不需要區域檢查,這可避免問題。

另請參閱

about_Environment_Variables

about_Group_Policy_Settings

about_Signing

Get-executionpolicy

Get-Item

Pwsh 控制台說明

Set-ExecutionPolicy

Unblock-File