主題
    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) (英文)




目錄