ブログ

PowerShell 実行時の「デジタル署名されていません」エラーの対処法

症状

.\Rename.ps1 : ファイル J:\Picture\Rename.ps1 を読み込めません。ファイル J:\Picture\Rename.ps1 はデジタル署名されていません。
このスクリプトは現在のシステムでは実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、
「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。

原因

PowerShellポリシーに反してネットワークドライブ(NAS)などで ps1 ファイルを実行したことが原因。

(参考:PowerShell 実行ポリシー

対処法

  • A. PowerShell実行ポリシーを変える
  • B. PowerShellファイルに自己署名証明書を付ける

2つの方法があるので、それぞれ解説してきます。

ポイント

  • 1度だけのスクリプト実行なら、PowerShell実行ポリシーを変えるのが便利(例:リネームスクリプト)
  • 定期的なスクリプト実行なら、該当PowerShellに自己署名証明書を付けるのが良い

+ A. 実行ポリシーを変えてPowerShell実行する方法(クリックで展開)

PowerShell実行ポリシーを変える方法

PowerShell で Get-ExecutionPolicy -list で現在のポリシーを表示します。

Process が Undefined なっていることが確認できます。

これを Bypass にすると、任意のPowerShellファイルが実行可能になります。
(PowerShell を閉じれば Process は Undefined に戻るのでセキュリティ安全)

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass で Process のポリシーを変更します。

再度 Get-ExecutionPolicy -list でポリシーを確認してみましょう。

Process が Bypass になっていますね。

これで、任意のPowerShellファイルが実行可能になっています。

Process が Bypass のままではセキュリティリスクがあるので、PowerShell を閉じてポリシーを戻します。

再度 PowerShell を起動して Get-ExecutionPolicy -list して確認します。

Process は Undefined に戻っていますね。

実行ポリシーを変えてPowerShell実行する方法はこれで解説終了です。

+ B. 自己署名証明書を付けてPowerShell実行する方法(クリックで展開)

該当PowerShell に自己署名証明書を付ける方法

リネームスクリプトなどではなく、定期的に実行するスクリプトの場合は自己署名証明書を付けるのがオススメ。

実行ポリシーを変更している時間が長いほどセキュリティリスクがあるので。

1. 該当PowerShellスクリプトをDドライブ直下に置く

NASではなくDドライブ直下に該当PowerShellを用意します。

例えば、MyScript.ps1 とします。(D:\MyScript.ps1)

2. MyScript.ps1 に自己署名証明書を付ける

以下をテキストファイルにコピペして、SelfSign.ps1 として保存。

このファイルもDドライブ直下に置く。(D:\SelfSign.ps1)

# 署名用の証明書を作成
$cert = New-SelfSignedCertificate `
        -Subject "CN=PowerShellスクリプト署名用証明書" `
        -KeyAlgorithm RSA `
        -KeyLength 2048 `
        -Type CodeSigningCert `
        -CertStoreLocation Cert:\CurrentUser\My\ `
        -NotAfter ([datetime]"2099/01/01")
# 信頼済みのルートとして使用
Move-Item "Cert:\CurrentUser\My\$($cert.Thumbprint)" Cert:\CurrentUser\Root

# 証明書への参照を取得
$rootcert = @(Get-ChildItem cert:\CurrentUser\Root -CodeSigningCert)[0]
# スクリプトに署名
Set-AuthenticodeSignature D:\MyScript.ps1 $rootcert

15行目の MyScript.ps1 へのパスが合っている確認する。

SelfSign.ps1のディレクトリでPowerShell起動し、SelfSign.ps1 を実行します。

すると、自己署名証明書が付いた MyScript.ps1 が得られます。

MyScript.ps1 をエディタで開くと、以下の文字列の追加を確認できます。

# SIG # Begin signature block
# MIIGCwYJKoZIhvcNAQcCoIIF/DCCBfgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
(省略)
# SIG # End signature block

3. MyScript.ps1 を NASの該当フォルダにコピーして実行

MyScript.ps1 を NASの該当フォルダにコピーします。

デジタル署名されているので、NAS上で MyScript.ps1 が実行できます。

-ブログ

© 2022 墾田ええねん! Powered by AFFINGER5