无法获取Get-SQLAgent服务器属性,该如何解决?
问题分析与解决方案
首先直接给结论:这个命令在你的环境下本来就无法正常运行,核心原因是你使用的SqlServer PowerShell模块版本(21.1.18068)和SQL Server 2012 SP4的兼容性不匹配。微软从SqlServer模块16.x版本开始,就不再对SQL Server 2012提供官方支持,更高版本的模块在访问旧版SQL Server的Agent集合属性(比如Properties、TargetServerGroups)时会触发T-SQL执行异常。
下面是具体的解决办法,按优先级排序:
1. 降级SqlServer模块到兼容版本
这是最直接的修复方案,因为新版本模块已经放弃了对SQL Server 2012的适配:
- 先卸载当前的高版本模块:
# 卸载指定版本(如果有多个版本共存) Uninstall-Module -Name SqlServer -RequiredVersion 21.1.18068 -Force # 如果只有这一个版本,直接用 Uninstall-Module -Name SqlServer -Force - 安装兼容SQL Server 2012的最新稳定版本(推荐15.x系列,比如15.0.18206.0):
Install-Module -Name SqlServer -RequiredVersion 15.0.18206.0 -Force -AllowClobber - 验证安装结果:
切换到这个版本后,再执行(Get-Module -Name SqlServer -ListAvailable).Version(Get-SqlAgent -ServerInstance DBSERVER02).Properties应该就能正常枚举所有属性了。
2. 用T-SQL替代PowerShell模块获取数据
如果不想降级模块,可以直接通过T-SQL查询msdb数据库的系统对象来获取所需信息,绕开模块的兼容性问题:
- 获取SQL Agent的核心属性:
USE msdb; EXEC dbo.sp_get_sqlagent_properties; - 获取目标服务器组信息:
USE msdb; SELECT * FROM dbo.sysservergroups; SELECT * FROM dbo.sysjobservers; - 在PowerShell中执行这些T-SQL的命令:
Invoke-SqlCmd -ServerInstance DBSERVER02 -Database msdb -Query "EXEC dbo.sp_get_sqlagent_properties"
3. 排查潜在的权限问题(虽然无提示,但仍需确认)
虽然你没有收到权限报错,但某些Agent属性的访问需要特定的msdb数据库角色权限:
- 你的账号需要至少拥有
SQLAgentOperatorRole角色权限(更高的SQLAgentAdminRole或SQLAgentReaderRole也可以) - 执行以下T-SQL检查你的账号权限:
如果你的账号不在该角色中,联系管理员添加即可(不过这不是你当前报错的直接原因,但能避免后续其他操作的权限问题)USE msdb; EXEC sp_helprolemember 'SQLAgentOperatorRole';
内容的提问来源于stack exchange,提问作者lit
相关产品推荐
相关产品推荐

