SQL Agent作业PowerShell步骤AuthorizationManager校验失败求助
SQL Agent PowerShell作业中的授权与可信发布者问题解答
问题背景
在SQL Agent作业的PowerShell步骤中使用代理凭据运行时,遭遇以下异常与问题:
- 抛出
AuthorizationManager check failed错误 - 执行
import-module SQLPS -Version 15.0时,加载扩展类型数据文件失败 - 以代理账户运行SQLPS.exe时,弹出“未可信发布者”提示,但该发布者为微软官方,且对应证书已导入当前用户及本地机器的TrustedPublisher存储,当前PowerShell执行策略为
AllSigned
1. 已导入信任证书为何仍弹窗?
- 代理账户的证书存储独立:你导入证书到当前登录用户或本地机器的TrustedPublisher,但SQL Agent代理使用指定账户运行,该账户的用户级TrustedPublisher存储可能未导入对应证书。Windows证书存储分机器级和用户级,代理进程优先读取自身用户级存储。
- 证书哈希不匹配:核对SQLPS.exe的数字签名证书哈希,与你导入的证书哈希是否一致。微软有多份代码签名证书,可能你导入的不是用于签名SQLPS.exe的那一份。
- 执行策略上下文差异:机器级执行策略设为
AllSigned,但代理账户的用户级执行策略可能被设为更严格的规则(如Restricted)。可在代理账户上下文运行Get-ExecutionPolicy -List确认。
2. PowerShell是否存在中间信任列表?
PowerShell没有所谓的“中间信任列表”,其代码签名信任机制完全依托Windows证书体系:
- 核心依赖
TrustedRoot Certification Authorities(根证书信任)和Trusted Publishers(发布者证书信任)两类存储 - 执行策略(ExecutionPolicy)是额外的管控层,与证书信任互补,不属于中间信任机制
- 少数PowerShell模块可能有内部校验逻辑,但这是模块自身行为,并非PowerShell全局的中间信任列表
3. 能否非交互式设置“始终运行”?
可以通过以下方式实现非交互式信任,消除弹窗:
- 将证书导入代理账户的用户级TrustedPublisher:
在代理账户上下文(例如用runas /user:代理账户 powershell打开会话)执行:# 获取SQLPS.exe的签名证书 $cert = (Get-AuthenticodeSignature -FilePath "C:\Program Files\Microsoft SQL Server\150\Tools\Binn\SQLPS.exe").SignerCertificate # 导出并导入到当前用户的TrustedPublisher $cert | Export-Certificate -FilePath "C:\temp\sqlps_sign_cert.cer" -Type CERT certutil -addstore TrustedPublisher "C:\temp\sqlps_sign_cert.cer" - 调整代理账户的执行策略:
若证书导入后仍有问题,可在代理账户上下文设置用户级执行策略:Set-ExecutionPolicy AllSigned -Scope CurrentUser -Force - 在SQL Agent步骤中指定进程级执行策略:
在作业的PowerShell脚本开头添加以下命令,仅对当前作业进程生效:Set-ExecutionPolicy AllSigned -Scope Process -Force
内容的提问来源于stack exchange,提问作者Vocoder
相关产品推荐
相关产品推荐

