about_Execution_Policies

簡短描述

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

完整描述

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

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

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

執行政策不是安全邊界,而是縱深防禦。 例如,當使用者無法執行腳本時,可以在命令列輸入腳本內容,輕鬆繞過政策。 相反地,執行原則可協助用戶設定基本規則,並防止他們意外違反這些規則。

欲了解更多安全邊界的資訊,請參閱 PowerShell 安全功能中的安全服務標準章節。

在非 Windows 電腦上,預設執行策略是Unrestricted且無法更改的。 Set-ExecutionPolicy Cmdlet 可供使用,但 PowerShell 會顯示不支援的控制台訊息。 雖然Get-ExecutionPolicyUnrestricted在非 Windows 平台上回報不錯,但行為非常接近Bypass,因為這些平台並未實作 Windows 安全性 Zones。

PowerShell 執行原則

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

  • AllSigned

    • 腳本可以執行。
    • 要求所有腳本和組態檔都由受信任的發行者簽署,包括您在本機計算機上撰寫的腳本。
    • 在執行來自尚未分類為受信任或未受信任的發行者的腳本之前,會先提示您。
    • 執行已簽署但惡意腳本的風險。
  • Bypass

    • 未封鎖任何專案,而且沒有任何警告或提示。
    • 此執行原則是針對PowerShell腳本內建在較大應用程式中的組態所設計,或針對PowerShell是其本身安全性模型之程式的基礎組態所設計。
  • Default

    • 設定預設執行原則。
    • Windows 用戶端和伺服器的 RemoteSigned
  • RemoteSigned

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

    • 允許單獨指令,但不允許腳本。
    • 防止執行所有腳本檔案,包括格式化和組態檔(.ps1xml)、模組腳本檔案(.psm1),以及 PowerShell 配置檔(.ps1)。
  • Undefined

    • 目前範圍中沒有設定執行原則。
    • 如果所有範圍中的執行原則為 Undefined,則對於 Windows 用戶端,有效的執行原則是 Restricted,而對於 Windows Server,則是 RemoteSigned
  • Unrestricted

    • 非 Windows 電腦的預設執行策略,且無法更改。
    • 未簽署的腳本可以執行。 執行惡意腳本的風險。
    • 在執行不是來自近端內部網路區域的腳本和組態檔之前,先警告使用者。

    注意

    在不區分通用命名規則(UNC)路徑與網際網路路徑的系統中,由 UNC 路徑識別的腳本可能不允許執行 RemoteSigned 執行政策。

執行政策範圍與優先順序

你可以設定一個只在特定範圍內有效的執行政策。 參數接受以下數值:

  • MachinePolicy - 由電腦的所有使用者的組策略設定
  • UserPolicy - 由電腦目前使用者的組策略設定
  • Process - 僅影響目前的 PowerShell 工作階段
  • CurrentUser - 僅影響目前的使用者
  • LocalMachine - Default 影響所有電腦使用者的範圍

注意

MachinePolicyUserPolicy 由群組政策設定。 如果你嘗試將作用域設為這些值之一,PowerShell 會顯示錯誤訊息,表示範圍是由群組原則設定且無法更改。

若執行政策未由群組政策定義,有效執行策略依優先順序決定如下:

  • Process - 最高優先權。 Process 範圍只會影響目前的PowerShell工作階段。 執行策略保存在 environment variable $Env:PSExecutionPolicyPreference中,而不是註冊表中。 關閉 PowerShell 工作階段時,會刪除變數和值。
  • CurrentUser - 第二高優先權。 設定儲存在使用者專屬 powershell.config.json 檔案中。
  • LocalMachine - 最低優先權。 設定會儲存在檔案中 $PSHOME/powershell.config.json

欲了解更多檔案資訊 powershell.config.json ,請參見 about_PowerShell_Config

使用 PowerShell 管理執行原則

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

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

Get-ExecutionPolicy

若要取得影響目前的工作階段的所有執行原則,並依優先順序顯示這些原則:

Get-ExecutionPolicy -List

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

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

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

若要針對特定範圍設定執行原則,請使用 ScopeGet-ExecutionPolicy 參數。

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

Get-ExecutionPolicy -Scope CurrentUser

變更執行原則

若要變更 Windows 電腦上的 PowerShell 執行原則,請使用 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 用戶端的預設值。

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

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

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

例如:

pwsh.exe -ExecutionPolicy AllSigned

您設定的執行原則不會儲存在組態檔中。 而是儲存在 $Env:PSExecutionPolicyPreference 環境變數中。 當您關閉設定原則的工作階段時,會刪除變數。 你無法透過編輯變數值來更改政策。

在會話中,為該會話設定的執行政策會優先於本地電腦或現有使用者設定檔中設定的執行政策。 不過,它不會優先於使用組策略所設定的執行原則。

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

您可以使用 開啟文稿執行 組策略設定來管理企業中的電腦執行原則。 組策略設定會在所有層級中覆寫 PowerShell 中設定的執行政策。

開啟腳本執行 政策設定如下:

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

  • 如果您啟用 開啟文稿執行,您可以選取執行原則。 組策略設定相當於下列執行原則設定:

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

PowerShellCoreExecutionPolicy.admPowerShellCoreExecutionPolicy.admx檔案會在群組政策編輯器的電腦設定與使用者設定節點中,依以下路徑新增「開啟腳本執行」政策:

Administrative Templates\Windows Components\Windows PowerShell

在 [計算機設定] 節點中設定的原則優先於 [用戶設定] 節點中設定的原則。

如需詳細資訊,請參閱 about_Group_Policy_Settings

管理已簽署和未簽署的指令碼

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

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

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

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

注意

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

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

Windows Server Core 和 Windows 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 Shell 在 Windows Server Core 和 Windows Nano Server 上無法使用。

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

使用 繞過(ByPass )或 全簽名(AllSigned )執行策略不需要區域檢查,避免了這個問題。

另請參閱