Windows PowerShell Execution Policy

簡單來說:Windows PowerShell 的 Execution Policy 是一種安全機制,用來控制是否允許執行 PowerShell 腳本,以及腳本是否需要簽章。它不是完整的安全邊界,而是幫助使用者避免不小心執行惡意程式碼。


🌐 Execution Policy 的核心概念

  • 目的:限制或允許 PowerShell 腳本的執行,避免未經授權或惡意腳本在系統上運行 1 2
  • 範圍 (Scope)
    • LocalMachine:影響整台電腦上的所有使用者。
    • CurrentUser:僅影響目前使用者。
    • Process:僅影響當前 PowerShell 工作階段,關閉後失效。
    • UserPolicy / MachinePolicy:由群組原則 (Group Policy) 設定,優先權最高 1

🔑 常見的 Execution Policy 類型

執行政策 說明
Restricted 預設值,不允許任何腳本執行,只能輸入命令。
RemoteSigned 本機建立的腳本可執行,從網路下載的腳本必須有受信任的簽章。
AllSigned 所有腳本都必須有受信任的簽章。
Unrestricted 允許所有腳本執行,但下載的腳本會有警告提示。
Bypass 完全不限制,沒有警告或阻擋。
Undefined 沒有設定,會回退到更高層級的政策。

⚙️ 常用指令

  • 查看目前政策
    Get-ExecutionPolicy
    
  • 查看所有範圍的政策
    Get-ExecutionPolicy -List
    
  • 設定政策 (需管理員權限)
    Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
    
  • 僅限當前工作階段
    Set-ExecutionPolicy Bypass -Scope Process
    

🚨 注意事項

  • Execution Policy 不是防毒軟體:它只是降低誤執行惡意腳本的風險,並不能完全防止攻擊 2
  • Group Policy 優先:如果系統有群組原則設定,即使手動修改也可能被覆蓋 1
  • 安全建議:一般建議使用 RemoteSigned,既能允許本機腳本執行,又能避免下載的未簽章腳本直接跑 3 2

👉 總結:Windows PowerShell 的 Execution Policy 是一種「安全提醒機制」,幫助你在執行腳本前做出判斷。它不是絕對的安全防護,但能降低誤執行惡意程式的風險。


⚙️ CI/CD Pipeline 常用 Execution Policy 設定表

使用情境 建議政策 說明
本機開發測試 RemoteSigned 允許本機腳本執行,下載的腳本需簽章,安全性與便利性平衡。
CI/CD 工作階段 (臨時 Session) Bypass -Scope Process 僅限當前工作階段,避免永久降低安全性。適合 pipeline 自動化。
團隊共用伺服器 RemoteSignedAllSigned 確保所有人執行的腳本安全,避免惡意或未驗證的腳本。
快速 Debug 或緊急修復 Bypass -Scope Process 臨時放寬限制,完成後關閉 Session 即恢復安全。
高安全性環境 (金融、政府) AllSigned 強制所有腳本必須有受信任簽章,安全性最高。

🚀 實務小技巧

  • pipeline YAML/批次腳本 中加上:
    powershell -ExecutionPolicy Bypass -File build.ps1
    
    這樣只影響該次執行,不會改變系統全域設定。
  • 團隊協作:建議大家統一使用 RemoteSigned,避免因政策不同導致腳本無法執行。
  • 安全提醒:不要永久設成 UnrestrictedBypass,否則容易被惡意腳本利用。

👉 這樣你在 CI/CD pipeline 裡就能快速決定要用哪種政策,既能跑自動化腳本,又不會犧牲安全性。


⚠️ 常見錯誤與解法速查表

錯誤情境 錯誤訊息/現象 解法
政策被 Group Policy 覆蓋 Set-ExecutionPolicy 無效,或執行後仍顯示原本政策 使用 Get-ExecutionPolicy -List 檢查,若 MachinePolicyUserPolicy 有值,代表被群組原則鎖定。需由系統管理員修改 GPO。
腳本被阻擋 (Restricted) 執行 .ps1 檔案時顯示「此系統已停用腳本執行」 將政策改為 RemoteSigned 或在 pipeline 中使用 -ExecutionPolicy Bypass
下載的腳本無法執行 從網路下載的 .ps1 檔案被阻擋 檢查檔案屬性,右鍵 → 內容 → 勾選「解除封鎖」。或使用 Unblock-File script.ps1
臨時需要執行腳本 不想永久更改政策,但要跑一次腳本 使用:powershell -ExecutionPolicy Bypass -File script.ps1。僅影響該次執行。
不同使用者政策衝突 在同一台機器,不同帳號執行結果不同 使用 Get-ExecutionPolicy -List 檢查 CurrentUserLocalMachine,分別設定即可。
CI/CD pipeline 腳本失敗 腳本在 build agent 上被阻擋 在 pipeline YAML 或批次檔中指定:powershell -ExecutionPolicy Bypass -File build.ps1,避免永久修改 agent。

🚀 小技巧

  • 快速檢查所有層級政策
    Get-ExecutionPolicy -List
    
  • 解除下載檔案封鎖
    Unblock-File .\script.ps1
    
  • 避免永久降低安全性:盡量使用 Bypass -Scope Process 或在 pipeline 命令行指定,而不是全域修改。

👉 這樣你就有一份「錯誤 → 解法」的速查表,遇到問題可以立刻定位。
Execution Policy 決策流程圖,讓你在遇到問題時可以快速判斷該怎麼處理。


🧭 Execution Policy 決策流程圖

                ┌───────────────────────────┐
                │ 腳本無法執行?             │
                └───────────────┬───────────┘
                                │ 是
                                ▼
                ┌───────────────────────────┐
                │ 使用 Get-ExecutionPolicy   │
                │ 檢查目前政策               │
                └───────────────┬───────────┘
                                │
        ┌───────────────────────┼─────────────────────────┐
        ▼                       ▼                         ▼
  Restricted/AllSigned     RemoteSigned              Bypass/Unrestricted
        │                       │                         │
        ▼                       ▼                         ▼
  需要允許腳本?           腳本來源?                已允許,但仍失敗?
        │                       │                         │
        ▼                       ▼                         ▼
  設定 RemoteSigned      本機 → 可執行           檢查是否被 GPO 覆蓋
  或在命令行指定         下載 → 需簽章           (Get-ExecutionPolicy -List)
  Bypass -Scope Process

🚀 使用方式

  • 快速判斷:先用 Get-ExecutionPolicy -List 看是哪個範圍在限制。
  • 臨時執行:用 powershell -ExecutionPolicy Bypass -File script.ps1,避免永久降低安全性。
  • 下載檔案阻擋:用 Unblock-File script.ps1 或解除封鎖屬性。
  • 團隊協作:統一設定 RemoteSigned,避免不同人遇到不同錯誤。

👉 有了這個流程圖,你就能在 CI/CD pipeline 或日常自動化中快速定位問題並解決。
Execution Policy 最佳實務清單 (Checklist),讓你或團隊在 CI/CD pipeline 與日常自動化中兼顧安全性與便利性。


✅ Execution Policy 最佳實務清單

1. 政策選擇

  • 開發環境:使用 RemoteSigned,允許本機腳本執行,下載的需簽章。
  • CI/CD pipeline:在命令行指定 -ExecutionPolicy Bypass -Scope Process,避免永久降低安全性。
  • 高安全性環境:使用 AllSigned,確保所有腳本都有受信任的簽章。
  • 避免:長期使用 Unrestricted 或全域 Bypass

2. 臨時執行

  • 在 pipeline 或批次檔中加上:
    powershell -ExecutionPolicy Bypass -File build.ps1
    
    僅影響該次執行,不改變系統全域設定。

3. 下載腳本安全

  • 檢查檔案屬性 → 解除封鎖
  • 或使用:
    Unblock-File .\script.ps1
    

4. 政策檢查

  • 使用:
    Get-ExecutionPolicy -List
    
    確認是否被 Group Policy 覆蓋。
  • 若被 GPO 鎖定,需由系統管理員修改。

5. 團隊協作

  • 統一政策 (建議 RemoteSigned)。
  • 在文件或 onboarding 指南中明確說明設定方式。
  • 避免因不同政策導致腳本執行失敗。

6. 安全提醒

  • Execution Policy 不是防毒軟體,只是降低誤執行風險。
  • 永遠搭配 程式碼審查版本控管簽章,確保安全。

👉 有了這份 checklist,你就能快速檢查並套用最佳實務,確保團隊自動化流程既安全又流暢。


📝 範例 CI/CD YAML 片段

範例 CI/CD YAML 片段,展示如何在 pipeline 中指定 ExecutionPolicy,讓腳本能順利執行而不影響系統全域設定。

Azure DevOps Pipeline

steps:
- task: PowerShell@2
  inputs:
    targetType: 'filePath'
    filePath: 'build.ps1'
    arguments: '-ExecutionPolicy Bypass'
    pwsh: true

GitHub Actions

jobs:
  build:
    runs-on: windows-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Run PowerShell script

        run: |
          powershell -ExecutionPolicy Bypass -File build.ps1

GitLab CI

build_job:
  stage: build
  tags:
    - windows
  script:
    - powershell -ExecutionPolicy Bypass -File build.ps1

🚀 使用要點

  • 僅限工作階段Bypass 在這裡只影響 pipeline 執行,不會永久改變 agent 的設定。
  • 安全性:避免在全域設定 Unrestricted,保持系統安全。
  • 團隊一致性:建議在文件中明確規範,讓所有人都用相同方式執行。

👉 有了這個範例,你就能直接把 ExecutionPolicy 控制嵌入到 CI/CD pipeline 裡,既能跑自動化腳本,又不會影響系統安全。


🔐 PowerShell 腳本安全最佳實務

PowerShell 腳本安全最佳實務清單,讓你在自動化與 CI/CD pipeline 中兼顧安全性、可維護性與團隊透明度。

1. 簽章與信任

  • 使用 受信任的憑證簽署腳本 (Set-AuthenticodeSignature)。
  • 團隊共用腳本時,確保簽章憑證已安裝在所有開發/執行環境。
  • 在高安全性環境中,搭配 AllSigned Execution Policy 強制簽章。

2. 版本控管

  • 將腳本放入 Git 或其他版本控管系統。
  • 使用 Pull RequestMerge Request流程,確保程式碼審查。
  • 在 CI/CD pipeline 中自動化 lint測試,避免未經驗證的腳本進入生產。

3. 程式碼審查

  • 建立團隊審查規範,至少一人審查後才能合併。
  • 檢查腳本是否有 硬編碼密碼不安全 API未處理錯誤
  • 使用 PSScriptAnalyzer 工具自動檢查最佳實務。

4. 安全的憑證與密碼管理

  • 避免將密碼或 Token 寫入腳本。
  • 使用 Windows Credential ManagerSecret Vault
  • 在 CI/CD pipeline 中,透過 安全變數 (Secrets) 提供憑證。

5. 執行環境安全

  • 在 pipeline 中使用 -ExecutionPolicy Bypass -Scope Process,避免永久降低安全性。
  • 對下載的腳本執行 Unblock-File,並檢查來源。
  • 定期審查 Get-ExecutionPolicy -List,確保沒有被惡意修改。

6. 日誌與透明度

  • 腳本執行時輸出 詳細日誌,方便 Debug 與審計。
  • 在 CI/CD pipeline 中保存執行紀錄,確保可追溯性。
  • 對失敗案例提供 錯誤代碼與重試機制

👉 有了這份清單,你的團隊就能在自動化中保持安全、透明與可維護性。


📝 PowerShell 安全腳本範本

安全腳本範本,展示如何在 PowerShell 腳本中整合 簽章檢查錯誤處理安全憑證讀取。這樣你在 CI/CD pipeline 或團隊自動化中就能兼顧安全性與可維護性。

<#
.SYNOPSIS
  安全範本:簽章檢查 + 錯誤處理 + 安全憑證讀取
.DESCRIPTION
  適用於 CI/CD pipeline 或團隊共用腳本。
#>
# 1. 簽章檢查
try {
    $signature = Get-AuthenticodeSignature $PSCommandPath
    if ($signature.Status -ne 'Valid') {
        Write-Error "腳本簽章無效或缺失,請確認憑證。"
        exit 1
    }
} catch {
    Write-Warning "無法檢查簽章:$_"
}
# 2. 錯誤處理 (全域)
$ErrorActionPreference = "Stop"
function Safe-Run {
    param([ScriptBlock]$Block)
    try {
        & $Block
    } catch {
        Write-Error "執行失敗:$_"
        exit 1
    }
}
# 3. 安全憑證讀取 (避免硬編碼密碼)
try {
    $credential = Get-StoredCredential -Target "MyService"
    if (-not $credential) {
        Write-Error "找不到憑證,請先在 Credential Manager 儲存。"
        exit 1
    }
} catch {
    Write-Error "憑證讀取失敗:$_"
    exit 1
}
# 4. 主流程
Safe-Run {
    Write-Output "開始執行安全腳本..."
    # 在這裡放置主要邏輯,例如 CI/CD 部署
    # ...
    Write-Output "腳本執行完成 ✅"
}

🚀 範本特色

  • 簽章檢查:確保腳本來源可信。
  • 全域錯誤處理:避免未捕捉的錯誤導致 pipeline 崩潰。
  • 安全憑證讀取:使用 Windows Credential Manager 或 Secret Vault,而非硬編碼密碼。
  • 可擴充Safe-Run 函式可包裝任何任務,確保錯誤被捕捉並記錄。
    👉 有了這個範本,你就能快速建立安全、可維護的 PowerShell 腳本,並直接套用到 CI/CD pipeline。

📝 指令結構: powershell -Command "Set-ExecutionPolicy Unrestricted -Scope LocalMachine -Force"

powershell -Command "Set-ExecutionPolicy Unrestricted -Scope LocalMachine -Force"

1. powershell -Command

  • 表示在命令列中直接呼叫 PowerShell,並執行後面指定的命令字串。

2. Set-ExecutionPolicy

  • 這是 PowerShell 用來設定 執行原則 (Execution Policy) 的指令。
  • 執行原則決定了 PowerShell 腳本能否執行,以及需要什麼安全檢查。

3. Unrestricted

  • 這是執行原則的一種模式。
  • 效果:允許執行所有腳本,不論是否簽署。
  • :如果腳本是從網路下載的,第一次執行時會跳出警告提示。

4. -Scope LocalMachine

  • 指定影響範圍。
  • LocalMachine:套用到整台電腦的所有使用者。
  • 這意味著不只是你,電腦上的其他使用者也會受到這個設定影響。
  • 需要 管理員權限 才能修改。

5. -Force

  • 強制執行,不會跳出確認提示。
  • 直接覆蓋原本的設定。

⚠️ 安全影響

  • 把執行原則設成 Unrestricted + LocalMachine,等於整台電腦都允許執行任何 PowerShell 腳本。
  • 在企業或多人共用環境中,這可能會降低安全性,因為惡意腳本也能被執行。
  • 在 CI/CD pipeline 或測試環境中,通常會用 BypassProcess scope,而不是直接改整台機器。

✅ 建議用法

  • 開發環境 (個人電腦):可以用 RemoteSigned -Scope CurrentUser,兼顧安全與方便。
  • CI/CD pipeline:用 Bypass -Scope Process,只影響當前流程,不會改整台電腦。
  • 除非必要,不建議用 Unrestricted -Scope LocalMachine,因為安全風險較高。

👉 簡單來說:
這個指令會 在整台電腦上,永久允許所有使用者執行任何 PowerShell 腳本,而且不再要求簽章。它很強大,但也很危險。



🔑 Execution Policy 種類

Execution Policy 的種類,並且提供 不同 Scope 的差異表,再附上範例指令,讓你在 CI/CD 或本機環境都能靈活使用。

執行原則 說明
Restricted 預設值,禁止執行任何腳本。
AllSigned 所有腳本必須由受信任的發行者簽署。
RemoteSigned 本機建立的腳本可執行;下載的腳本需有簽章。
Unrestricted 可執行所有腳本,但下載的腳本會跳出警告。
Bypass 完全不阻擋、不警告,所有腳本都能執行。
Undefined 移除目前範圍的設定,回到更高層級的預設值。

📌 Scope 差異

Scope 影響範圍 特性
Process 只影響目前 PowerShell 進程 關閉後就失效,常用於 CI/CD pipeline
CurrentUser 只影響目前使用者 寫入使用者設定檔,持久有效
LocalMachine 影響整台電腦所有使用者 需管理員權限,最強制

🖥️ 範例指令

1. 僅在目前 Process 有效 (CI/CD 常用)

powershell -Command "Set-ExecutionPolicy Bypass -Scope Process -Force"

2. 設定為 RemoteSigned,僅影響目前使用者

powershell -Command "Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force"

3. 設定為 Unrestricted,影響整台電腦 (需管理員)

powershell -Command "Set-ExecutionPolicy Unrestricted -Scope LocalMachine -Force"

4. 檢查目前所有 Scope 的狀態

Get-ExecutionPolicy -List

💡 建議做法

  • GitHub Actions / CI/CD → 用 Bypass + Process,避免受系統策略影響。
  • 本機開發環境 → 用 RemoteSigned + CurrentUser,兼顧安全與方便。

Also See

File5FileLast Modified
windows batch file with path namewindows batch file with path name1:26 AM - December 07, 2025
UntitledUntitled1:25 AM - December 07, 2025
Everything極高速Windows 檔案搜尋工具Everything極高速Windows 檔案搜尋工具1:25 AM - December 07, 2025
Windows多種命令列工具搜尋檔案Windows多種命令列工具搜尋檔案8:21 PM - December 06, 2025
Windows 如何用where找檔案Windows 如何用where找檔案8:21 PM - December 06, 2025