PowerShell 執行原則錯誤解決方案

Votes

Upvotes

0

Upvotes: 0

Downvotes

0

Downvotes: 0

Net votes

+0

Prompt #1

windows powershell 問題: + opencode + ~~~~~~~~     + CategoryInfo          : SecurityError: (:) [], PSSecurityException     + FullyQualifiedErrorId : UnauthorizedAccess

Response #1

這是一個非常經典的 PowerShell 錯誤,通常發生在你嘗試執行一個腳本(例如 .ps1 檔案)時,而你的系統目前的 執行原則 (Execution Policy) 設定為禁止執行腳本。

簡單來說,這是 Windows 為了防止惡意腳本自動執行而設的一道安全門。

解決方法:更改執行原則

要解決這個問題,你需要將執行原則更改為 RemoteSigned(允許執行本地編寫的腳本,但來自網路的腳本需要數位簽章)。

請按照以下步驟操作:

  1. 以管理員身分開啟 PowerShell

    • 在開始功能表搜尋「PowerShell」。
    • 右鍵點擊「Windows PowerShell」,選擇 「以系統管理員身分執行」
  2. 輸入更改指令: 在視窗中輸入以下指令並按下 Enter:

    powershell Set-ExecutionPolicy RemoteSigned

  3. 確認更改: 系統會詢問是否確定要更改,請輸入 Y 然後按 Enter。

常見問題與補充

  • 如果我只想在目前的視窗暫時允許執行? 如果你不想更改全域設定,可以在啟動 PowerShell 時加上參數:

    powershell powershell.exe -ExecutionPolicy Bypass -File .\你的腳本.ps1

  • 檢查目前的原則狀態: 如果你想查看目前的設定,可以輸入:

    powershell Get-ExecutionPolicy -List

  • 這安全嗎? RemoteSigned 是開發者最常用的設定。它比完全開放(Unrestricted)安全,因為它要求從網上下載的指令碼必須有信任的簽章,但它允許你執行自己在電腦上寫的代碼。

需要我幫你檢查目前的執行原則列表,或是解釋各個權限等級的差異嗎?

Prompt #2

請解釋各個權限等級的差異

Response #2

在 PowerShell 中,執行原則 (Execution Policy) 並不是一種用來限制使用者能力的「權限」系統,而是一種安全策略,用來決定系統在什麼條件下允許載入設定檔與執行腳本。

以下是各個等級的詳細差異:

執行原則等級對照表

等級 說明 安全程度 建議用途
Restricted 預設值 (一般 Windows)。不允許執行任何腳本,僅能執行單行指令。 最高的 一般日常使用,不需跑腳本時。
AllSigned 只允許執行有「受信任發行者」數位簽章的腳本。 極度重視安全的企業環境。
RemoteSigned 本地寫的腳本可直接執行;從網路下載的則必須有簽章。 中 (平衡) 最推薦! 開發者與系統管理員的首選。
Unrestricted 允許所有腳本執行。若是從網路下載的,會跳出警告詢問。 測試環境,但不建議長期開啟。
Bypass 完全不阻擋、不警告、不提示。通常用於自動化整合工具。 暫時性自動化任務。
Undefined 未設定。會根據作業系統回到預設值 (通常是 Restricted)。 N/A 移除特定範圍的設定。

詳細解析

1. Restricted (受限)

這是 Windows 用戶端的預設設定。它基本上把 PowerShell 當成一個單純的命令行工具(像 CMD),你可以輸入 diripconfig,但如果你寫了一個 myscript.ps1,它絕對不讓你跑。

2. AllSigned (僅限簽署)

這是最嚴格的執行模式。即使是你自己在記事本寫的簡單腳本,也必須經過數位簽章(需要憑證)才能執行。這能有效防止腳本內容被竄改。

3. RemoteSigned (遠端簽署)

這是 Windows Server 的預設值,也是最實用的平衡點

  • 本地腳本:你自己寫的 .ps1 檔案,直接執行沒問題。
  • 下載腳本:從網路(Email、GitHub、瀏覽器)下載的檔案會被標記為「來自網際網路」,此時必須有簽章才能跑。 > 小技巧:如果你下載了一個腳本但沒有簽章,你可以右鍵點擊該檔案 -> 屬性 -> 勾選「解除封鎖 (Unblock)」,它就會被視為本地腳本。

4. Unrestricted (不限制)

它會執行所有腳本,但它很有「禮貌」。如果偵測到檔案來自網路,它會先跳出一個框問你:「你確定要跑這個嗎?這可能有危險。」

5. Bypass (繞過)

這個等級通常不是給人用的,而是給程式用的。例如某些部署工具在背景跑 PowerShell 時,為了不被任何警告視窗卡住,會使用這個參數。

如何查看不同範圍 (Scope) 的設定?

PowerShell 的原則可以設定在不同層級(電腦、使用者、目前視窗)。你可以輸入以下指令來查看「誰在影響你」:

Get-ExecutionPolicy -List

你想知道如何針對「特定檔案」解除封鎖,而不需要更改全域的安全設定嗎?

Prompt #3

請說明在powershell裡面環境變數的使用方法, 例如顯示所有的變數, 顯示單一變數, 變更等

Response #3

在 PowerShell 中,環境變數(Environment Variables)被視為一種虛擬磁碟機(名為 Env:)。這讓你操作變數時,感覺就像在操作檔案系統一樣直觀。

以下是環境變數的常用操作方法:

1. 顯示環境變數

顯示「所有」變數

你可以像查看資料夾內容一樣,列出所有的環境變數:

Get-ChildItem Env:
# 或者縮寫
dir Env:

顯示「單一」變數

最快的方法是在變數名稱前加上 $env: 字首:

# 顯示電腦名稱
$env:COMPUTERNAME

# 顯示系統路徑 (Path)
$env:Path

2. 新增或變更變數(僅限本次工作階段)

當你直接使用 $env: 賦值時,這項變更只會對目前的 PowerShell 視窗生效。一旦關閉視窗,設定就會消失。

  • 建立/覆蓋變數powershell $env:MY_VAR = "Hello World"
  • 在現有變數後「追加」內容(常用於修改 Path): powershell $env:Path += ";C:\MyNewFolder"

3. 永久變更環境變數(User 或 Machine 等級)

如果你希望關閉視窗後設定依然存在,需要動用 .NET 框架的方法。環境變數分為三個層級(Scope):Process (目前視窗)、User (目前使用者)、Machine (整台電腦)。

  • 設定「使用者」層級變數(永久): powershell [Environment]::SetEnvironmentVariable("MY_VAR", "NewValue", "User")
  • 設定「系統」層級變數(永久,需管理員權限): powershell [Environment]::SetEnvironmentVariable("MY_VAR", "NewValue", "Machine")

4. 刪除環境變數

  • 暫時刪除(目前視窗): 將其設為 $null 或空字串,或者使用 Remove-Itempowershell $env:MY_VAR = $null # 或者 Remove-Item Env:\MY_VAR
  • 永久刪除: 同樣使用 .NET 方法,將值設為 $nullpowershell [Environment]::SetEnvironmentVariable("MY_VAR", $null, "User")

常用技巧總結表

操作目標 指令範例 生效範圍
讀取所有 dir Env: N/A
讀取特定 $env:Path N/A
快速修改 $env:VAR = "value" 僅限目前視窗
永久修改 [Environment]::SetEnvironmentVariable(...) 使用者或全電腦
檢查路徑 $env:Path -split ';' 讓亂糟糟的 Path 變好讀

💡 小提醒: 當你透過 .NET 或控制台修改了「永久」環境變數後,已經開啟的 PowerShell 視窗不會自動更新,你必須重啟 PowerShell 才能抓到新的值。

你想知道如何透過 PowerShell 快速備份你的 Path 變數,以防萬一改壞掉嗎?

Comments

Login to add a comment.

No comments yet.