运行 PowerShell 时出现的“未进行数字签名”错误怎么办
错误详情
2025-08-20 11:17:38.546 File XX.ps1 cannot be loaded. The file XX.ps1 is not digitally signed. You cannot run this script on the current system. For more information about running script
s and setting execution policy, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
+ CategoryInfo : SecurityError: (😃 [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess
执行策略
要想知道发生这个错误的原因,我们需要先了解什么是执行策略。
powershell脚本在计算机上的执行权限是根据执行策略来决定的。系统的五种执行策略分别是:
- Restricted 阻止运行所有脚本文件,但允许在PowerShell环境中执行单个命令。
- AllSigned 要求所有脚本和配置文件必须由受信任的发布者签名才能运行,否则被阻止
- RemoteSigned 仅要求从Internet下载的脚本签名,本地创建的脚本无需签名即可运行
- Unrestricted 允许运行所有脚本,但对于未签名的脚本会发出警告,不强制签名要求
- Bypass 无任何限制,所有脚本可直接运行,且不显示警告或提示
执行策略中另一个很重要的概念是应用范围。执行策略的应用范围按从大到小分别是:
- MachinePolicy 由计算机的组策略设置,影响整个计算机的所有用户
- LocalMachine 策略对所有用户生效,是默认范围
- UserPolicy 由用户的组策略设置,仅影响当前登录用户
- CurrentUser 策略仅对当前用户生效,不影响其他用户
- Process 策略仅在当前PowerShell会话中有效,会话关闭后丢失
了解了这些概念,发生本文的错误的原因就很明显了,权限不够。当前的脚本文件需要签名才能执行。
更多更详细的执行策略信息可以查看官方文档
执行策略
解决办法
这个问题有两种解决办法。
方法一:修改系统的执行策略
执行策略用命令有:
- Get-ExecutionPolicy 检查计算机上当前的执行策略设置
- Get-ExecutionPolicy -List 列出所有范围的执行策略设置。
- Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 更改执行策略
我们此处可以使用Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass更改进程的策略。
或者
-Scope 后的参数为应用范围,修改范围从小到大,直到可以执行该脚本。
方法二:为当前脚本添加签名
对于需要经常或者周期性运行的脚本,最好的办法不是方法一,而是为该脚本添加签名。办法如下:
- 将该脚本放在目录a中,目录a建议为非c盘的目录。
- 在同目录下新建脚本b,脚本内容如下:
# 署名用の証明書を作成
$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 目录a\脚本c.ps1 $rootcert
脚本c为想要签名的脚本名。
- 运行脚本b,是否追加签名的提示框选是。
- 执行完成,打开脚本c,可以看到在脚本的最末,追加了签名信息
# SIG # Begin signature block
# MIIFwwYJKoZIhvcNAQcCoIIFtDCCBbACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
......
# KvIxsnAoqyKtoZhUDdRCMKXIf4xrlis7oE2vOkFuclKG2aunvPkmSTSKYMk8EfXU
# uIeyoVBka5WecXZnF2NswfwIWqP4WOqIkmLpFv/DpWTbJ4jFRtRCoHKCNIJLOBck
# TuxxqeuObdgikOnvSnVjP8x4x7rWbnrCa1ofkatGt4ffdBqMmZDDaJYY7/vNVxub
# L0mK4z7VSaI2BAVUGhlY79Tr2X0tSdI3fwE2wvRE5AhCIZRfaCxt
# SIG # End signature block
- 签名完成后,脚本c可以复制到当前计算机的任意为止执行。



2120

被折叠的 条评论
为什么被折叠?



