我在使用 PowerShell SQLSERVER 提供程序和 SQLRegistration\Central Management Server Group 目录时遇到了奇怪的行为。以下是行为。我想知道 SQLSERVER 提供程序如何知道注册了哪些 CMS,以便我可以理解为什么它在 SSMS 2014 中完成时似乎没有注意到注册(有关详细行为,请参见下文)。另外,当我知道实例在线时,为什么我的连接失败。
安装
机
- 本地主机
实例
- 本地主机\SQL2012
- 本地主机\SQL2014
- 本地主机\SQL2014_1
行为 1
使用 SSMS 2014,我将 localhost\SQL2012 注册为 CMS。执行此代码不会返回任何项目。
PS SQLSERVER:\SQLRegistration\Central Management Server Group> dir
打开和关闭 PowerShell 控制台,SSMS 不会改变结果。如果我打开 SSMS 2012 并将 localhost\SQL2012 注册为 CMS 并重新运行上述命令,我会看到 localhost\SQL2012 按预期注册。
行为 2
让服务器成功列出后...
目录:Microsoft.SqlServer.Management.PSProvider\SqlServer::SQLSERVER:\SQLRegistration\Central Management Server Group
模式名称
- 本地主机\SQL2012
并且运行以下命令以尝试导航到我注册的服务器组失败并出现以下错误,即使实例在线且可用。
PS SQLSERVER:\SQLRegistration\Central Management Server Group> Set-Location "localhost\SQL2012\"
设置位置:找不到路径“SQLSERVER:\SQLRegistration\Central Management Server Group\localhost\SQL2012\”,因为它不存在。在 line:1 char:1 + Set-Location "localhost\SQL2012\" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo : ObjectNotFound: (SQLSERVER:\SQLR...alhost\SQL2012:String) [Set-Location], ItemNotFoundE xception + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand
更新 1
SMO 似乎工作正常。以下代码成功返回我的服务器组。
#Load SMO assemblies
$CentralManagementServer = "localhost\sql2012"
$MS='Microsoft.SQLServer'
@('.SMO', '.Management.RegisteredServers', '.ConnectionInfo') |
foreach-object {if ([System.Reflection.Assembly]::LoadWithPartialName("$MS$_") -eq $null) {"missing SMO component $MS$_"}}
$connectionString = "Data Source=$CentralManagementServer;Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString)
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection)
$CentralManagementServerStore = new-object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore($conn)
$CentralManagementServerStore.ServerGroups[ "DatabaseEngineServerGroup" ].ServerGroups
肖恩关于 SQL Server 版本之间差异的解释似乎是有针对性的。因此,我认为 SMO 是一种更稳定的方法。我将使用下面的代码继续前进。
行为 1 我可以预期,因为在较低版本的实例上使用较高版本的 SSMS 时,某些功能可能会或可能不会按预期工作。从 2014 年到 2012 年,背景中可能发生了一些细微的变化,您可能永远找不到任何文档。如果您每次都可以在另一台机器上重新创建此场景,我实际上会在此创建一个连接项。
现在,行为 2 在我第一次尝试时失败,但之后每次都成功,即使在打开/关闭窗口之后也是如此。但是,如果您仅使用
PowerShell.exe
它来尝试此操作,那么当您与提供者打交道时,预计某些事情将不会以完全相同的方式发挥作用SQLPS
。如果您尝试在其中执行相同的命令,SQLPS.exe
我希望它每次都能正常工作,至少对我有用。现在我没有使用 SQL Server 2014,现在我的机器上只加载了 2012。您可以通过比较每个加载的程序集来了解差异
PowerShell.exe
和差异的事实:SQLPS.exe