PowerShell中无法初始化RegisteredServersStore对象的问题求助
你遇到的核心问题是:PowerShell无法找到接受Microsoft.SqlServer.Management.Common.ServerConnection参数的RegisteredServersStore构造函数,尽管文档显示该重载存在。结合你的环境(PowerShell 5.1、SqlServer模块22.1.1),可以从以下方向排查解决:
1. 验证当前SMO版本的构造函数重载
SqlServer模块自带的SMO(SQL Server管理对象)版本可能与你参考的文档版本不一致。先执行以下命令,确认RegisteredServersStore的所有可用构造函数:
[Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore]::GetConstructors() | ForEach-Object { "参数类型: " + ($_.GetParameters() | ForEach-Object { $_.ParameterType.FullName }) -join ", " }
如果输出中没有Microsoft.SqlServer.Management.Common.ServerConnection类型的参数,说明当前SMO版本确实不存在该重载,此时需要:
- 升级SqlServer模块到最新稳定版,或降级到文档对应的版本
- 手动加载对应版本的SMO程序集(需本地有该版本的SQL Server SDK或客户端工具)
2. 显式处理参数类型匹配
PowerShell的New-Object有时会因隐式类型转换失败导致重载匹配错误,尝试显式指定构造函数:
$ServerConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection('ServerName') # 精准定位构造函数 $ctor = [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore].GetConstructor([Type[]]@([Microsoft.SqlServer.Management.Common.ServerConnection])) $store = $ctor.Invoke($ServerConnection)
如果这一步仍报错,说明当前环境确实不存在该构造函数重载。
3. 替代方式获取RegisteredServersStore
若无法通过构造函数传入连接对象,可先创建Server实例,再直接获取关联的RegisteredServersStore:
$server = New-Object Microsoft.SqlServer.Management.Smo.Server('ServerName') $store = $server.RegisteredServersStore
这种方式无需手动传入连接对象,Server实例会自动处理上下文关联,绕过构造函数的问题。
4. 排查dbatools与SqlServer模块的兼容性
你提到问题源于dbatools的Add-DbaRegServer,建议:
- 更新dbatools到最新版本:
Update-Module dbatools -Force,新版本可能已适配不同SqlServer模块版本的构造函数差异 - 若更新后仍有问题,尝试降级SqlServer模块到21.x版本(部分用户反馈22.x版本的SMO存在构造函数变更)
5. 确保SMO程序集完整加载
有时SqlServer模块的程序集可能未完全加载,手动加载RegisteredServers相关程序集:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.RegisteredServers") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
加载完成后再尝试创建RegisteredServersStore对象。
内容的提问来源于stack exchange,提问作者Kyguy77

