PowerShell 指令碼執行策略

2022-01-13 05:40:52 字數 3511 閱讀 2261

為防止惡意指令碼的執行,powershell 中設計了乙個叫做執行策略(execution policy)的東西(我更傾向於把它叫做指令碼執行策略)。我們可以在不同的應用場景中設定不同的策略來防止惡意指令碼的執行。本文主要是解釋這些執行策略,因為筆者在學習的時候發現它們並不是那麼清晰易懂。

powershell 提供了 restricted、allsigned、remotesigned、unrestricted、bypass、undefined 六種型別的執行策略,接下來我們一一介紹。

單詞 restricted 的意思是 "受限制的",所以這種執行策略主要是限制指令碼的執行。說簡單點就是:可以執行單個的命令,但是不能執行指令碼。當執行策略為 restricted 時執行指令碼會收到下面的錯誤:

遺憾的是在 windows 8, windows server 2012, and windows 8.1 的系統中,restricted 被設定為預設的執行策略。所以在這些環境中要執行 powershell 指令碼的第一件事就是調整指令碼的執行策略。比如設定成不會限制指令碼執行的 bypass:

set-executionpolicy -executionpolicy bypass
注意,設定指令碼的執行策略需要管理員許可權,因此你需要以管理員許可權啟動 powershell ,然後執行上面的命令。

signed 在這裡指有數字簽名的指令碼,也就是說 allsigned 執行策略允許執行所有具有數字簽名的指令碼。當然我們也可以換個角度說:只能執行具有數字簽名的指令碼。據我所知我們能見到的絕大多數的 powershell 指令碼是沒有數字簽名的。如果執行沒有簽名的指令碼,會提示下面的錯誤:

接下來我們要搞清楚如何給乙個 powershell 指令碼簽名(打上數字簽名)?並且在 allsigned 執行策略下執行這個指令碼。

給 powershell 指令碼簽名需要使用 set-authenticodesignature 命令,當然前提是你得擁有乙個合法的數字證書。比如筆者使用的數字證書檔名為 test.pfx。先用數字證書檔案構建乙個證書物件:

$cert = get-pfxcertificate -filepath "

test.pfx

"

一般情況下都會為證書設定密碼,所以這一步需要輸入密碼進行驗證。然後為 demo.ps1 指令碼檔案簽名:

上圖中最後一行中間列顯示檔案的前面狀態為 valid,表示已經簽名成功。讓我們再來看看 demo.ps1 指令碼檔案都發生了什麼變化!開啟 demo.ps1 檔案的屬性介面:

比原來多了乙個 "digital signatures" 標籤頁,這裡便是數字簽名的資訊。接著開啟 demo.ps1 看看:

除了第一行指令碼命令外,被新增了很多行的注釋,這都是數字簽名幹的。

接下來我們在 allsigned 執行策略下執行一下指令碼 demo.ps1:

這次的提示是說你的系統還沒有信任這個證書的持有者(筆者把證書持有者的資訊打碼了:)),要不要執行這個指令碼?此時就需要使用者做出判斷了,如果選擇  "always run",不僅會執行該指令碼,還會把該證書新增到信任列表中:

上圖便是選擇 "always run" 之後證書管理器中的資訊,筆者用來簽名指令碼的數字證書已經被新增到信任列表中了(就是右邊紅框中的證書資訊)。一旦信任了這個數字證書,以後再執行由這個數字證書簽名的指令碼就不會再有提示了!

注意:數字證書的使用只是增添了一道安全機制,絕不意味著有數字簽名的指令碼就一定是安全可靠的。國內某證書頒發機構就因為沒有底線亂髮證書而被谷歌、火狐等產品移出了信任列表。既然有這樣的證書頒發機構存在,就會有人藉機購買數字證書並給惡意的指令碼簽名,所以不能僅憑是否有數字簽名來區分指令碼是否可信。

原來,在 windows 提供的 api 中,有個列舉可以標識檔案的**。

上圖紅框中的內容便是對相關屬性的描述。我們還可以通過命令 notepad "0start.sp1:zone.identifier" 在記事本中以文字的方式顯示其屬性:

但這僅僅是個提示,還是允許指令碼執行的。

bypass 執行策略對指令碼的執行不設任何的限制,任何指令碼都可以執行,並且不會有安全性提示。

undefined 表示沒有設定指令碼策略。當然此時會發生繼承或應用預設的指令碼策略。

scope  指執行策略的應用範圍。原來我們可以給不同的應用範圍設定執行策略。比如程序、當前使用者和本機。

get-executionpolicy 和 set-executionpolicy 命令預設操作的都是本機的指令碼執行策略。如果要獲得當前使用者的執行策略可以使用 -scope 選項:

get-executionpolicy -scope currentuser
同樣如果僅修改當前使用者的執行策略可以在 set-executionpolicy 命令中使用 scope 引數。

set-executionpolicy -executionpolicy -scope currentuser
很明顯,powershell 精心設計了指令碼的執行策略。遺憾的是在 windows 8, windows server 2012, and windows 8.1 的系統中,restricted 被設定為預設的執行策略。這讓學習 powershell 的新手們多少有些不知所措,因為所有人都會在第一次執行指令碼時遭遇不能執行的問題。還好 ms 在新的系統中把預設的執行策略改成了 remotesigned,至少對新手來說更友好了。

POWERSHELL指令碼執行許可權

powershell指令碼執行許可權 2009 02 04 16 55 02 分類 powershell 字型大小 訂閱 restricted 預設的設定,不允許任何script執行 allsigned 只能執行經過數字證書簽名的script unrestricted 允許所有的script執行 解...

POWERSHELL指令碼執行許可權

powershell指令碼執行許可權 2009 02 04 16 55 02 分類 powershell 字型大小 訂閱 restricted 預設的設定,不允許任何script執行 allsigned 只能執行經過數字證書簽名的script unrestricted 允許所有的script執行 解...

powershell禁止執行指令碼

無法載入檔案 d users documents windowspowershell profile.ps1,因為在此系統上禁止執行指令碼。有關詳細資訊,請參閱 https go.microsoft.com fwlink linkid 135170 中的 about execution polici...