about_Execution_Policies
簡短描述
描述 PowerShell 執行原則,並說明如何管理它們。
詳細描述
PowerShell 的執行原則是一項安全功能,可控制 PowerShell 載入組態檔和執行腳本的條件。 此功能有助於防止執行惡意指令碼。
在 Windows 電腦上,您可以為本機電腦、目前使用者或特定工作階段設定執行原則。 您也可以使用群組原則設定來設定電腦和使用者的執行原則。
本機計算機和目前使用者的執行原則會儲存在PowerShell組態檔中。 您不需要在 PowerShell 設定檔中設定執行原則。 特定工作階段的執行原則只會儲存在記憶體中,並在工作階段關閉時遺失。
執行原則不是限制使用者動作的安全性系統。 例如,當使用者無法執行腳本時,可以在命令行輸入腳本內容,輕鬆地 bypass 建立原則。 相反地,執行原則可協助用戶設定基本規則,並防止他們意外違反這些規則。
在非 Windows 電腦上,執行 default 原則是 Unrestricted 且無法變更。 Cmdlet Set-ExecutionPolicy
可供使用,但 PowerShell 會顯示不支援的控制台訊息。 雖然Get-ExecutionPolicy
在非 Windows 平臺上傳Unrestricted回,但行為確實相符Bypass,因為這些平臺不會實作 Windows 安全性 區域。
PowerShell 執行原則
這些原則的強制執行只會發生在 Windows 平臺上。 PowerShell 執行原則如下所示:
AllSigned
- 腳本可以執行。
- 要求所有腳本和組態檔都由受信任的發行者簽署,包括您在本機計算機上撰寫的腳本。
- 先提示您,再從尚未分類為受信任或未受信任的發行者執行腳本。
- 執行已簽署但惡意腳本的風險。
Bypass
- 未封鎖任何專案,而且沒有任何警告或提示。
- 此執行原則是針對PowerShell腳本內建在較大應用程式中的組態所設計,或針對PowerShell是其本身安全性模型之程式的基礎組態所設計。
Default
- default設定執行原則。
- Restricted 適用於 Windows 用戶端。
- Windows 伺服器的 RemoteSigned 。
RemoteSigned
- default Windows 伺服器電腦的執行原則。
- 腳本可以執行。
- 需要來自受信任發行者的數位簽名,這些腳本和組態檔是從因特網下載的,其中包含電子郵件和立即訊息程式。
- 不需要在本機計算機上撰寫且未從因特網下載的腳本上使用數字簽名。
- 如果腳本已解除封鎖,請執行從因特網下載且未簽署的腳本,例如使用
Unblock-File
Cmdlet。 - 從因特網以外的來源執行未簽署的腳本,以及可能是惡意的已簽署腳本的風險。
Restricted
- default Windows 用戶端電腦的執行原則。
- 允許個別命令,但不允許腳本。
- 防止執行所有腳本檔案,包括格式化和組態檔 (
.ps1xml
)、模組腳本檔案 (.psm1
) 和 PowerShell 配置檔 (.ps1
)。
Undefined
- 目前 scope中沒有設定執行原則。
- 如果所有範圍內的執行原則為 Undefined,有效的執行原則適用於 Restricted Windows 用戶端,而 適用於 Windows Server 的 RemoteSigned 。
Unrestricted
- default非 Windows 電腦的執行原則,無法變更。
- 未簽署的腳本可以執行。 執行惡意腳本的風險。
- 在執行不是來自近端內部網路區域的腳本和組態檔之前,先警告使用者。
注意
在無法區分通用命名約定 (UNC) 路徑與因特網路徑的系統上,可能無法使用 RemoteSigned 執行原則來執行 UNC 路徑所識別的腳本。
執行原則 scope
您可以設定只在特定 scope中有效的執行原則。
的有效值為 Scope 、UserPolicy、Process、CurrentUser 和 LocalMachine。 MachinePolicy LocalMachine 是 default 設定執行原則時的 。
這些 Scope 值會依優先順序列出。 優先順序的原則在目前的會話中有效,即使優先順序較低層級設定較嚴格的原則也一樣。
如需詳細資訊,請參閱 Set-ExecutionPolicy。
MachinePolicy
由計算機的所有用戶設定組策略。
UserPolicy
由電腦目前使用者的組策略設定。
Process
Processscope只會影響目前的PowerShell會話。 執行原則會儲存在環境變數
$env:PSExecutionPolicyPreference
中,而不是組態檔。 關閉 PowerShell 工作階段時,會刪除變數和值。CurrentUser
執行原則只會影響目前的使用者。 它儲存在 CurrentUser 組態檔中。
LocalMachine
執行原則會影響目前計算機上的所有使用者。 它儲存在 AllUsers 組態檔中。
使用 PowerShell 管理執行原則
若要取得目前 PowerShell 會話的有效執行原則,請使用 Get-ExecutionPolicy
Cmdlet。
下列命令會取得有效的執行原則:
Get-ExecutionPolicy
若要取得影響目前會話的所有執行原則,並依優先順序顯示這些原則:
Get-ExecutionPolicy -List
結果看起來類似下列範例輸出:
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine AllSigned
在此情況下,有效的執行原則是 RemoteSigned ,因為目前使用者的執行原則優先於本機電腦所設定的執行原則。
若要取得特定 scope設定的執行原則,請使用 Scope 的 Get-ExecutionPolicy
參數。
例如,下列命令會取得 CurrentUserscope 的執行原則:
Get-ExecutionPolicy -Scope CurrentUser
變更執行原則
若要變更 Windows 電腦上的 PowerShell 執行原則,請使用 Set-ExecutionPolicy
Cmdlet。 變更會立即生效。 您不需要重新啟動 PowerShell。
如果您設定 LocalMachine 或 CurrentUser 範圍的執行原則,變更會儲存在組態檔中,並維持有效狀態,直到您再次變更為止。
如果您設定的執行原則 Processscope,則不會儲存在組態檔中。 執行原則會保留,直到目前 process 和任何子進程關閉為止。
注意
在 Windows Vista 和更新版本的 Windows 中,若要執行命令來變更本機電腦的 執行原則 LocalMachinescope,請使用 [ 以系統管理員 身分執行] 選項啟動 PowerShell。
若要變更您的執行原則:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
若要在特定 scope中設定執行原則:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
例如:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
變更執行原則的命令可以成功,但仍無法變更有效的執行原則。
例如,設定本機計算機執行原則的命令可以成功,但由目前使用者的執行原則覆寫。
拿掉執行原則
若要移除特定 scope的執行原則,請將執行原則設定為 Undefined。
例如,若要移除本機計算機所有使用者的執行原則:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
若要移除 的執行原則 Scope:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
如果沒有在任何 scope中設定執行原則,有效的執行原則是 Restricted,這是 Windows 用戶端的 default 。
為一個會話設定不同的原則
您可以使用的 pwsh.exe
ExecutionPolicy 參數,為新的 PowerShell 會話設定執行原則。 此原則只會影響目前的工作階段和子會話。
若要設定新會話的執行原則,請在命令行啟動 PowerShell,例如cmd.exe
或從 PowerShell 啟動,然後使用的 pwsh.exe
ExecutionPolicy 參數來設定執行原則。
例如:
pwsh.exe -ExecutionPolicy AllSigned
您設定的執行原則不會儲存在組態檔中。 而是儲存在環境變數中 $env:PSExecutionPolicyPreference
。 當您關閉設定原則的工作階段時,會刪除變數。 您無法編輯變數值來變更原則。
在工作階段期間,為會話設定的執行原則優先於本機計算機或目前使用者組態檔中設定的執行原則。 不過,它不會優先於使用組策略所設定的執行原則。
使用群組原則管理執行原則
您可以使用開啟指令碼執行群組原則設定來管理企業中電腦的執行原則。 群組原則設定會覆寫所有範圍內在 PowerShell 中設定的執行原則。
開啟指令碼執行原則設定如下所示:
如果停用開啟指令碼執行,指令碼就不會執行。 這相當於 Restricted 執行原則。
如果啟用 [開啟指令碼執行],則可選取執行原則。 群組原則設定相當於下列執行原則設定:
群組原則 執行原則 允許所有指令碼 Unrestricted 允許本機指令碼和遠端簽署的指令碼 RemoteSigned 只允許簽署的指令碼 AllSigned 如果未設定開啟指令碼執行,則不會有任何作用。 PowerShell 中設定的執行原則會發揮作用。
PowerShellExecutionPolicy.adm 和 PowerShellExecutionPolicy.admx 檔案會將開啟指令碼執行原則新增至下列路徑中群組原則編輯器的 [電腦設定] 和 [使用者設定] 節點。
若為 Windows XP 和 Windows Server 2003:
Administrative Templates\Windows Components\Windows PowerShell
若為 Windows Vista 和後續版本的 Windows:
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: LocalMachine
Execution Policy: CurrentUser
管理已簽署和未簽署的腳本
在 Windows 中,Internet Explorer 和 Microsoft Edge 等程式會將替代數據流新增至下載的檔案。 這會將檔案標示為「來自因特網」。 如果您的PowerShell執行原則是 RemoteSigned,PowerShell將不會執行從因特網下載的未簽署腳本,其中包含電子郵件和立即訊息程式。
您可以簽署腳本,或選擇執行未簽署的腳本,而不需要變更執行原則。
從 PowerShell 3.0 開始,您可以使用 Cmdlet 的 Get-Item
Stream 參數來偵測因為從因特網下載而遭到封鎖的檔案。 Unblock-File
使用 Cmdlet 解除封鎖文稿,以便您可以在 PowerShell 中執行這些腳本。
如需詳細資訊,請參閱 about_Signing、 Get-Item 和 Unblock-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 Desktop Shell 中的explorer.exe
API 來驗證腳本檔案的區域。 Windows Server Core 和 Windows Nano Server 上無法使用 Windows Shell。
如果 Windows 桌面殼層無法使用或沒有回應,您也可以在任何 Windows 系統上收到此錯誤。 例如,在登入期間,PowerShell 登入腳本可能會在 Windows Desktop 就緒之前開始執行,而導致失敗。
使用 或 AllSigned 的執行原則ByPass不需要區域檢查,以避免發生問題。