主題
簽名和執行策略
簡短說明
描述 Windows PowerShell 執行策略,以及如何使用和更改它們。
詳細說明
PowerShell 執行策略通過確定 PowerShell 載入設定檔和運行指令碼的條件,為指令碼環境提供安全性。
預設設定為最安全的策略“Restricted”。該設定允許運行單個命令,但不允許運行指令碼。
如果執行策略不允許 PowerShell 負載檔案或運行指令碼,則將顯示警告以解釋該 限制的原因。
“載入擴充類型資料檔案時出錯:”
“載入格式資料檔案時出錯:”
若要負載檔案或運行指令碼,請更改執行策略。
更改執行策略
------------------------------
您可以更改電腦上的 PowerShell 執行策略。該更改將立即生效,且一直保持到再次更改時。只有管理員才可更改該策略。
若要更改執行策略,請鍵入:
- Set-ExecutionPolicy <策略名稱>
例如,
- Set-ExecutionPolicy RemoteSigned
如果該命令執行成功,則 PowerShell 將顯示命令提示字元。沒有表示執行成功的訊息。如果該命令失敗,則 PowerShell 將顯示一條錯誤訊息,並還原到先前的執行策略。
若要查看 PowerShell 執行策略,請鍵入:
- Get-ExecutionPolicy
如果該命令執行失敗,則可能是由於拼錯了策略名稱。請檢查該名稱,然後重試。如果您無權運行此命令,請與系統管理員聯絡。
POWERSHELL 執行策略
------------------------------
PowerShell 執行策略包括:
Restricted
- 預設的執行策略。
- 允許單個命令運行,但無法運行指令碼。
AllSigned
- 可以運行指令碼。
- 要求可信發行者對所有指令碼和設定檔(包括本機電腦上編寫的指令碼)的
數位簽章。
- 在運行來自可信發行者的指令碼之前對您進行提示。
- 運行已簽名但有惡意的指令碼帶來的風險。
RemoteSigned
- 可以運行指令碼。
- 要求可信發行者對從 Internet(包括電子郵件和立即訊息程式)下載的指令碼和設定檔的數位簽章。
- 無需從本機電腦上啟動並執行指令碼的數位簽章。
- 在運行來自可信發行者的指令碼之前不向您提示。
- 運行已簽名但有惡意的指令碼帶來的風險。
Unrestricted
- 可以運行未簽名指令碼。
- 在警告您檔案來源於 Internet 後,運行從 Internet(包括 Microsoft Outlook、Outlook Express 和 Windows Messenger)下載的指令碼和設定檔。
- 運行惡意指令碼帶來的風險。
運行未簽名指令碼(REMOTESIGNED 執行策略)
--------------------------------------------------------
如果 PowerShell 執行策略為 RemoteSigned,則 PowerShell 將不會運行從Internet(包括電子郵件和立即訊息程式)下載的未簽名指令碼。
如果您試圖運行所下載的指令碼,則 PowerShell 將顯示以下錯誤訊息:
無法負載檔案 C:\remote.ps1。檔案 C:\remote.ps1 未經數位簽章。無法在系
統中執行該指令碼。有關詳細資料,請參閱“Get-Help about_signing”。
在運行該指令碼前,請檢查其代碼以確保該指令碼可信。指令碼與任何可執行程式具有同樣的效用。
若要運行未簽名指令碼,請執行以下操作:
1. 將指令檔儲存在電腦中。
2. 依次單擊“開始”、“我的電腦”,然後導航到儲存的指令檔。
3. 按右鍵該指令檔,然後單擊“屬性”。
4. 單擊“解除封鎖”。
如果從 Internet 下載的指令碼具有數位簽章,而您尚未選擇信任其發行者,則
PowerShell 將顯示以下訊息:
是否要運行來自此不可信發行者的軟體? 檔案 C:\remote_file.ps1 是由 CN=<發行者名稱> 發布的。此發行者在您的系統上不受信任。請只運行來自可信發行者的指令碼。
[V] 從不運行 [D] 不運行 [R] 運行一次 [A] 始終運行
[?] 協助(預設選擇是“D”):
如果您信任發行者,請選擇“運行一次”或“始終運行”。如果您不信任發行者,則請選擇“從不運行”或“不運行”。如果選擇“從不運行”或“始終運行”,則 PowerShell 將不再針對此發行者提醒您。
對指令碼進行簽名的方法
------------------------------------------
可以對編寫的指令碼以及來自其他源的指令碼進行簽名。在對任何指令碼進行簽名前,請檢查每條命令並驗證運行此指令碼是安全的。
有關如何在 PowerShell 命令列中對指令檔進行簽名的詳細資料,請鍵入:
- Get-Help Set-AuthenticodeSignature
若要為指令碼添加數位簽章,則必須使用程式碼簽署認證對其進行簽名。對指令檔進行簽名可使用以下兩種類型的認證:
-- 由憑證授權單位建立的認證:
公用憑證授權單位可驗證您的身份並向您頒發程式碼簽署認證,但要收取費用。
在從可信的憑證授權單位購買認證之後,您將可以與運行 Windows 的其他計
算機上的使用者共用該指令碼,因為其他電腦信任該憑證授權單位。
-- 您建立的認證:
您可以建立“自我簽署憑證”,而您的電腦就是建立該認證的頒發機構。這類證
書是免費的,它允許您在您的電腦上編寫、簽名和運行指令碼,但是其他計算
機不信任您的電腦,可能不會運行該指令碼。
如果您建立了自我簽署憑證,請確保為您的認證啟用強私密金鑰保護。從而防止惡意
程式以您的名義對指令碼進行簽名。本主題的最後部分將提供這些說明。
建立自我簽署憑證
-------------------------------------------------------------
若要建立自我簽署憑證,請使用 MakeCert.exe(一種工具,包含在 Microsoft .NETFramework SDK(1.1 及更高版本)和 Microsoft Platform SDK 中)。
若要使用 MakeCert 來建立認證,請執行以下操作:
在 SDK 命令提示字元視窗中,運行以下命令:
第一條命令將為電腦建立本地憑證授權單位。第二條命令從該憑證授權單位生
成個人認證:
- makecert -n "CN=PowerShell Local Certificate Root" -a sha1 `
- -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
- -ss Root -sr localMachine
-
- makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 `
- -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer
MakeCert 將提示您輸入私密金鑰密碼。
若要驗證產生的認證是否正確,請執行以下操作:
在 PowerShell 提示符下鍵入:
- get-childitem cert:\CurrentUser\My -codesigning
此命令使用 PowerShell 認證提供者來查看該認證的相關資訊。
如果該認證已建立完成,則輸出將顯示該認證的指紋,其中包含 PowerShell 使用者的驗證資料,如下所示:
目錄: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
指紋 使用者
---------- -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF CN=PowerShell User ]
對指令碼進行簽名
-------------
如果您具有自我簽署憑證,則可對指令碼進行簽名。如果使用 AllSigned 執行策略,則對指令碼進行簽名允許您在您的電腦上運行該指令碼。
以下樣本指令碼 sign-file.ps1 可對指令碼進行簽名。但如果使用 AllSigned 執行策略,則必須在運行 sign-file.ps1 之前對其進行簽名。
若要使用此指令碼,請將以下文本複製到文字檔中並將該文字檔命名為
sign-file.ps1。
(請確保該指令檔沒有 .txt 副檔名。如果文字編輯器向其追加 .txt,則請將
檔案名稱括在引號中,例如“sign-file.ps1”。)
- ## sign-file.ps1
- ## 對檔案進行簽名
- param([string] $file=$(throw "請指定檔案名稱。"))
- $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
- Set-AuthenticodeSignature $file $cert
若要對 sign-file.ps1 進行簽名,請在 PowerShell 命令提示字元下鍵入以下命令:
- $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
-
- Set-AuthenticodeSignature sign-file.ps1 $cert
在對指令碼進行簽名之後,即可在本機電腦上運行該指令碼。但是,如果電腦上的PowerShell 執行策略要求來自可信憑證授權單位的數位簽章,則此指令碼將無法在該電腦上運行。如果您試圖這樣做,則 PowerShell 將報告以下錯誤:
無法負載檔案 C:\remote_file.ps1。無法驗證該認證的簽名。
所在行:1 字元:15
+ .\ remote_file.ps1 <<<< 無法負載檔案 C:\remote_file.ps1。無法驗證該認證的簽名。
所在行:1 字元:15
+ .\ remote_file.ps1 <<<<
如果在運行非您編寫的指令碼時 PowerShell 顯示此訊息,請按照處理任何未簽名指令碼的方式來處理該檔案。檢查代碼,如果代碼可信,則對其進行簽名並運行。
為認證啟用強私密金鑰保護
---------------------------------------------------------
如果您的電腦上具有私人認證,則惡意程式可能會以您的名義對指令碼進行簽名,從而導致授權 PowerShell 運行這些指令碼。
若要防止以您的名義進行的自動簽名,請使用Cert Manager工具 (Certmgr.exe) 將您的簽署憑證匯出到 .pfx 檔案中。Cert Manager包含在Microsoft .NET Framework SDK、Microsoft Platform SDK,以及 Internet Explorer 5.0 及更高版本中。
若要匯出認證,請執行以下操作:
1. 啟動Cert Manager( GUI 工具)。
2. 選擇由“PowerShell Local Certificate Root”頒發的認證。
3. 單擊“匯出”以啟動認證匯出嚮導。
4. 選中“是,匯出私密金鑰”,然後單擊“下一步”。
5. 選中“啟用加強保護”。
6. 鍵入密碼,然後再次鍵入密碼進行確認。
7. 鍵入副檔名為 .pfx 的檔案名稱。
8. 單擊“完成”。
若要重新匯入認證,請執行以下操作:
1. 啟動Cert Manager( GUI 工具)。
2. 單擊“匯入”以啟動認證匯入嚮導。
3. 瀏覽到您在匯出過程中建立 .pfx 檔案的位置。
4. 在“密碼”頁上選中“啟用強私密金鑰保護”,然後輸入匯出過程中所指定的密碼。
5. 選擇“個人”憑證存放區。
6. 單擊“完成”。
另請參閱
有關程式碼簽署的資訊,請在 http://msdn.microsoft.com/ 的 Microsoft Developer Network (MSDN) 參考資料中搜尋“Introduction to Code Signing” (程式碼簽署簡介)。
有關 Set-AuthenticodeSignature 命令的資訊,請在 PowerShell 命令提示字元下輸入以下命令:
- help Set-AuthenticodeSignature