PowerShell调用SMO时ManagedComputer.ServerInstances集合为空排查
ServerInstances集合为空的原因及SSMS 2017影响说明
可能的原因
- WMI提供器版本不匹配:你加载的
Microsoft.SqlServer.SqlWmiManagement程序集版本如果和目标主机上安装的SQL Server WMI提供器版本不兼容,就会出现无法枚举实例的问题。特别是如果目标主机上同时存在多个版本的SQL Server组件,高版本的WMI提供器可能覆盖了旧版本的注册信息,导致低版本的SMO库无法正确读取实例配置。 - 权限不足:当前运行PowerShell会话的账号没有目标主机WMI命名空间
root\Microsoft\SqlServer\ComputerManagement13(SQL Server 2016对应版本号13)的读取权限,会导致枚举ServerInstances时返回空集合。注意即使你能正常读取Services集合,也不代表你有实例相关节点的读取权限,两类节点的权限控制是独立的。 - SQL Server WMI提供器损坏或未正确注册:SQL Server安装过程中如果WMI提供器注册失败,或者后续被其他软件修改、删除了注册表关联项,就会导致SMO无法读取实例列表。你可以尝试在目标主机上重新注册对应版本的WMI提供器:运行
mofcomp "C:\Program Files (x86)\Microsoft SQL Server\130\Shared\sqlmgmproviderxpsp2up.mof",之后重启WMI服务即可生效。 - 架构位宽不一致:虽然你使用的是64位PowerShell v5会话,但如果目标主机上的SQL Server WMI提供器只注册了32位版本,也会导致64位会话读取不到实例信息。可以尝试启动32位PowerShell(路径为
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe)重新运行代码验证。 - 集群实例配置异常:你所处的是集群环境,若部分集群节点的SQL Server实例配置没有同步写入本地WMI命名空间,或者集群资源的注册信息存在异常,也会导致本地WMI查询返回空的实例集合。
SSMS 2017的影响
SSMS 2017确实会对该集合的查询产生影响。SSMS 2017自带了SQL Server 2017版本的SMO库和WMI提供器,安装过程中会更新系统中注册的Microsoft.SqlServer.SqlWmiManagement程序集版本,同时修改WMI提供器的关联配置。如果你的代码没有指定明确的程序集版本,加载时会优先调用高版本的程序集,当高版本提供器和SQL Server 2016的WMI节点存在兼容性问题时,就会出现ServerInstances枚举为空的问题。
内容的提问来源于stack exchange,提问作者Louie
相关产品推荐
相关产品推荐

