主題 about_signing 簡短描述 說明如何簽署指令碼,使其符合 Windows PowerShell 執行原則。 完整描述 Restricted 執行原則不會允許任何指令碼執行。 AllSigned 和 RemoteSigned 執行原則禁止 Windows PowerShell 執行沒有數位簽章的指令碼。 本主題說明如何執行選取的未經簽署指令碼 (即使在執行原則為 RemoteSigned 時也一 樣),以及如何簽署指令碼供您自己使用。 如需 Windows PowerShell 執行原則的詳細資訊,請參閱 about_Execution_Policy。 若要允許執行已簽署的指令碼 ------------------------------- 當您第一次在電腦上啟動 Windows PowerShell 時,可能會實行 Restricted 執行原則 (預設 值)。 Restricted 原則不會允許任何指令碼執行。 若要找出電腦上的有效執行原則,請輸入: get-executionpolicy 若要執行您在本機電腦撰寫的未經簽署指令碼,以及其他使用者提供的已簽署指令碼,請使 用下列命令將電腦的執行原則變更為 RemoteSigned: set-executionpolicy remotesigned 如需詳細資訊,請參閱 Set-ExecutionPolicy。 執行未經簽署的指令碼 (REMOTESIGNED 執行原則) 如果 Windows PowerShell 執行原則為 RemoteSigned,Windows PowerShell 就不會執行從網際網路下載且未經簽署的指令碼,包括透過 電子郵件與立即訊息程式接收的未經簽署指令碼。 若您嘗試執行下載的指令碼,Windows PowerShell 將顯示下列錯誤訊息: <檔案名稱> 檔案無法載入。這個檔案 <檔案名稱> 未經數位簽署。這個指令碼 將不會在系統上執行。如需詳細資訊,請參閱 "Get-Help about_signing"。 執行指令碼之前,請先檢查其程式碼,確定您信任該指令碼。 指令碼的效力等同於任何的可執行程式。 執行未經簽署的指令碼: 1. 將指令檔儲存至電腦。 2. 按一下 [開始],再按一下 [我的電腦],然後找出剛才 儲存的指令檔。 3. 以滑鼠右鍵按一下指令檔,再按一下 [內容]。 4. 按一下 [解除封鎖]。 從網際網路下載的指令碼若已經過數位簽署,但您尚未選擇要信任其發行者,Windows PowerShell 會顯示下列訊息: 要執行來自這個不受信任發行者的軟體嗎? <檔案名稱> 檔案是由 CN=<發行者名稱> 所發行。這個發行者在您的系統上並不受信任。只可執行來自受信任的發行者的指令 碼。 [V] 永不執行 [D] 不要執行 [R] 執行一次 [A] 永遠執行 [?] 說明 (預設為 "D"): 若您信任該發行者,請選取 [執行一次] 或 [永遠執行]。如果不信任發行者,則選取 [永不執行] 或 [不要執行]。一旦選取 [永不執行] 或 [永遠執行],Windows PowerShell 日後將不再提示您確認該發行者。 簽署指令碼的方法 -------------------------- 您可以簽署自己撰寫的指令碼,以及從其他來源取得的指令碼。簽署任何指令碼之前,請 先檢查當中的每個命令,確認執行時安全無虞。 如需程式碼簽署的最佳作法,請參閱<程式碼簽署最佳作法>(英文),網址為 https://go.microsoft.com/fwlink/?LinkId=119096。 如需如何簽署指令檔的詳細資訊,請參閱 Set-AuthenticodeSignature。 若要為指令碼加上數位簽章,您必須使用程式碼簽署憑證簽署指令碼。適合用來簽署指令 檔的憑證有兩種: -- 由憑證授權單位建立的憑證: 支付費用後,公眾憑證授權單位會先確認您的身分,再核發程式碼簽署憑證給您。若 向具有公信力的憑證授權單位購得憑證,您就能將指令碼分享給其他 Windows 電 腦的使用者,因為他們的電腦都信任該憑證授權單位。 -- 由您自己建立的憑證: 您可以建立自我簽署憑證,將您的電腦當成建立憑證的授權單位。 這種憑證不僅免費,還能讓您在自己的電腦上撰寫、簽署及執行指令碼。不過,自 我簽署憑證所簽署的指令碼並不會在其他電腦執行。 通常自我簽署憑證是用來簽署供自己使用而撰寫的指令碼,以及簽署從其他來源取得而且已 確認安全無虞的指令碼。這種憑證不適用於共用的指令碼,即使是在企業內部也不適合。 若要建立自我簽署憑證,請確定您的憑證已啟用加強私密金鑰保護。這可防止惡意程式以 您的名義簽署指令碼。如需相關指示,請參閱本主題最後一節。 建立自我簽署憑證 -------------------------------- 若要建立自我簽署憑證,請使用憑證建立工具 (MakeCert.exe)。這套工具隨附於 Microsoft .NET Framework SDK (1.1 版與以後版本) 和 Microsoft Windows SDK。 如需 MakeCert.exe 工具之語法與參數說明的詳細資訊,請參閱 MSDN (Microsoft Developer Network) 文件庫中的<憑證建立工具 (MakeCert.exe)>,網址為 https://go.microsoft.com/fwlink/?LinkId=119097。 若要使用 MakeCert.exe 工具建立憑證,請在 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.exe 工具將會提示您輸入私密金鑰密碼。這個密碼可確保在未經您同意的情況 下,任何人都不能使用或存取憑證。請建立並輸入您記得住的密碼,稍後您將使用這個密 碼來擷取憑證。 若要確認是否已正確產生憑證,請使用下列命令取得電腦之憑證存放區中的憑證 (您無法 在檔案系統目錄中找到憑證檔案)。 在 Windows PowerShell 提示字元輸入: get-childitem cert:\CurrentUser\my -codesigning 這個命令會使用 Windows PowerShell 憑證提供者檢視憑證的相關資訊。 若已確實建立憑證,輸出結果將會顯示用於識別憑證的指紋,內容大致如下: 目錄: Microsoft.PowerShell.Security\Certificate::CurrentUser\My Thumbprint Subject ---------- ------- 4D4917CB140714BA5B81B96E0B18AAF2C4564FDF CN=PowerShell 使用者 ] 簽署指令碼 ------------- 建立自我簽署憑證之後,您就可以簽署指令碼。如果執行原則設為 AllSigned,簽署指令碼 將允許您在自己的電腦上執行指令碼。 下列樣本指令碼 Add-Signature.ps1 會簽署指令碼。不過,若您使用 AllSigned 執行 原則,就必須先簽署 Add-Signature.ps1 指令碼才能執行它。 若要使用這個指令碼,請將下列文字複製到文字檔,並將檔案命名為 Add-Signature.ps1。 注意:請確定指令檔的副檔名不是 .txt。如果文字編輯器自行加上 ".txt",請將檔名置於引 號中:"add-signature.ps1"。 ## add-signature.ps1 ## 簽署檔案 param([string] $file=$(throw "Please specify a filename.")) $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0] Set-AuthenticodeSignature $file $cert 若要簽署 Add-Signature.ps1 指令檔,請在 Windows PowerShell 命令提示字元輸入下 列命令: $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0] Set-AuthenticodeSignature add-signature.ps1 $cert 簽署指令碼之後,您就可以在本機電腦上執行已簽署的指令碼。 不過,其他電腦若將 Windows PowerShell 執行原則設為必須有來自受信任授權單位的數位 簽章,則這些電腦將無法執行該指令碼。如果嘗試執行,Windows PowerShell 將會顯示下 列錯誤訊息: C:\remote_file.ps1 檔案無法載入。憑證的簽章無法驗證。 位於第 1 行,第 15 個字元 + .\ remote_file.ps1 <<<< 在執行不是您自行撰寫的指令碼時,如果 Windows PowerShell 顯示上述訊息,請將該檔案 視同任何未經簽署的指令碼來處理。請檢查程式碼,確定您是否可以信任該指令碼。 為憑證啟用加強私密金鑰保護 --------------------------- 如果您的電腦上有私人憑證,惡意程式或許就能夠以您的名義簽署指令碼,進而授權 Windows PowerShell 執行這些指令碼。 若要防止程式以您的名義自動簽署,請使用憑證管理員 (Certmgr.exe) 將簽署憑證匯出 為 .pfx 檔案。憑證管理員隨附於 Microsoft .NET Framework SDK、Microsoft Windows SDK 與 Internet Explorer 5.0 與以後版本。 匯出憑證: 1. 啟動 [憑證管理員]。 2. 選取由 PowerShell Local Certificate Root 所核發的憑證。 3. 按一下 [匯出],啟動 [憑證匯出精靈]。 4. 選取 [是,匯出私密金鑰],然後按 [下一步]。 5. 選取 [啟用加強保護]。 6. 輸入密碼,再輸入相同密碼進行確認。 7. 輸入檔名,並使用 .pfx 做為副檔名。 8. 按一下 [完成]。 重新匯入憑證: 1. 啟動 [憑證管理員]。 2. 按一下 [匯入],啟動 [憑證匯入精靈]。 3. 開啟執行匯出程序時建立的 .pfx 檔案所在位置。 4. 在 [密碼] 頁面上選取 [啟用加強私密金鑰保護],然後輸入匯出過程中指定的密碼。 5. 選取 [個人] 憑證存放區。 6. 按一下 [完成]。 避免簽章過期 ----------------------------------- 指令碼中數位簽章的有效期限截至簽署憑證到期為止,或是只要時間戳記伺服器能夠確認指令碼是 在簽署憑證仍然有效時簽署,該數位簽章就有效力。 由於多數簽署憑證的有效期限只有一年,因此使用時間戳記伺服器能夠確保使用者在多年 以後仍然可以使用您的指令碼。 請參閱 about_Execution_Policies about_Profiles Get-ExecutionPolicy Set-ExecutionPolicy Set-AuthenticodeSignature <程式碼簽署簡介>(https://go.microsoft.com/fwlink/?LinkId=106296) (英文)