在Win7/2008 Server 使用PowerShell老是出現已停用指令碼執行的解決辦法

在Windows 7/2008 Server點選執行PowerShell時每次都會出現一個警告訊息如下圖:

image

這是因為基於安全起見,PowerShell後來加入了執行原則,執行原則包括了PowerShell安全性策略的一部份,他必須要您的指令碼檔需要數位簽屬後才可以執行,包括PowerShell的設定檔也是。

這裡PowerShell也提供了cmdlet的命令Set-ExecutionPolicy 可以修改執行原則的設定。在Set-ExecutionPolicy包含了6種原則設定詳細說明如下(系統預設為第一種):

1. Restricted
      預設執行原則。允許執行個別命令,但無法執行指令碼。無法執行所有的指令碼檔案,包括格式化和組態檔 (.ps1xml)、模組指令碼檔案 (.psm1) 和 Windows PowerShell 設定檔 (.ps1)。

2. AllSigned
      指令碼可以執行。所有的指令碼和組態檔都需經過受信任的發行者簽署,包括本機電腦上撰寫的指令碼在內。 在執行來自尚未分類為受信任或不受信任之發行者的指令碼之前,對您進行提示。 執行來自網際網路以外來源的未簽署指令碼以及已簽署 (但居心不良) 的指令碼會有風險。

3. RemoteSigned
      指令碼可以執行。 從網際網路下載的指令碼和組態檔都必須有受信任發行者的數位簽章 (包括由電子郵件程式和立即訊息程式所下載)。 已在本機電腦上執行及撰寫的指令碼 (並非從網際網路所下載) 不需要數位簽章。 執行已簽署但惡意的指令碼會有風險。

4. Unrestricted
      可以執行未經簽署的指令碼  (執行惡意的指令碼會有風險)。 在執行從網際網路下載的指令碼和組態檔之前,對使用者提出警告。

5. Bypass
      不會封鎖任何項目,而且沒有警告或提示。 在這個執行原則所針對的組態中,Windows PowerShell 指令碼是建立來提供較大的應用程式使用,或是做為本身具有安全性模型之程式的基礎。

6. Undefined
      目前的範圍中沒有設定執行原則。 如果所有範圍中的執行原則是 Undefined,則有效的執行原則為  Restricted,這是預設的執行原則。

此說是筆者由PowerShell的get-help about_Execution_Policies命令中擷取出來的,由此可以知道,預設是不允許執行任何指令碼的,而第二種AllSigned必須要數位簽屬才可以執行,可以使用公用程式MakeCert.exe搭配透過憑證授權單位產生個人憑證。不過一方面只是為了測試而已,另一方面筆者是個懶人,所以就是選擇第3種RemoteSigned,

要修改預設的執行原則可使用命令如下:

Set-ExecutionPolicy RemoteSigned

會出現如下的提示訊息,預設即是Y,所以直接按下Enter即可,除非您要停止執行,或暫停。如下圖:

image

執行完畢後再次執行PowerShell時會發現停用指令碼執行的訊息不會再出現了,如下圖:

image

參考資料:

PowerShell 的

get-help Get-ExecutionPolicy

get-help about_Execution_Policies

get-help about_Signing

等相關說明。

留言

這個網誌中的熱門文章

什麼是 gRPC ?

什麼是 gRPC(二)- 來撰寫第一個 Hello World 吧!

常見的程式碼壞味道(Code Smell or Bad Smell)