Skip to content
Permalink
Browse files

Add additional support for Local Server Groups (#5734)

* adjust for local

* add support for local reg

* works for local and remote

        # ADD IN ability to pipe a server!

* works locally and remotely

* support local instances

* updated docs and examples

* use that insteasd, need to do it for all commands

* cleanup

* remove tab wtf

* add proper params

* this may fix Collection was modified issue
  • Loading branch information...
potatoqualitee committed Jun 12, 2019
1 parent 8196ec8 commit ac6fc4857fad3658a39946c461ac4f6e3a7a905c
@@ -1,14 +1,14 @@
function Add-DbaRegServer {
<#
.SYNOPSIS
Adds registered servers to SQL Server Central Management Server (CMS)
Adds registered servers to SQL Server Central Management Server (CMS) or Local Server Groups
.DESCRIPTION
Adds registered servers to SQL Server Central Management Server (CMS). If you need more flexiblity, look into Import-DbaRegServer which
Adds registered servers to SQL Server Central Management Server (CMS) or Local Server Groups. If you need more flexiblity, look into Import-DbaRegServer which
accepts multiple kinds of input and allows you to add reg servers from different CMSes.
.PARAMETER SqlInstance
The target SQL Server instance
The target SQL Server instance if a CMS is used
.PARAMETER SqlCredential
Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)
@@ -17,14 +17,29 @@ function Add-DbaRegServer {
Server Name is the actual SQL instance name (labeled Server Name)
.PARAMETER Name
Name is basically the nickname in SSMS CMS interface (labeled Registered Server Name)
Name is basically the nickname in SSMS Registered Server interface (labeled Registered Server Name)
.PARAMETER Description
Adds a description for the registered server
.PARAMETER Group
Adds the registered server to a specific group.
.PARAMETER ActiveDirectoryTenant
Active Directory Tenant
.PARAMETER ActiveDirectoryUserId
Active Directory User id
.PARAMETER ConnectionString
SQL Server connection string
.PARAMETER OtherParams
Additional parameters to append to the connection string
.PARAMETER ServerObject
SMO Server Objects (from Connect-DbaInstance)
.PARAMETER InputObject
Allows the piping of a registered server group
@@ -57,6 +72,11 @@ function Add-DbaRegServer {
Creates a registered server on sql2008's CMS which points to the SQL Server, sql01. When scrolling in CMS, the name "sql01" will be visible.
.EXAMPLE
PS C:\> Add-DbaRegServer -ServerName sql01
Creates a registered server in Local Server Groups which points to the SQL Server, sql01. When scrolling in Registered Servers, the name "sql01" will be visible.
.EXAMPLE
PS C:\> Add-DbaRegServer -SqlInstance sql2008 -ServerName sql01 -Name "The 2008 Clustered Instance" -Description "HR's Dedicated SharePoint instance"
@@ -69,35 +89,53 @@ function Add-DbaRegServer {
Creates a registered server on sql2008's CMS which points to the SQL Server, sql01. When scrolling in CMS, the name "sql01" will be visible within the Seattle group which is in the hr group.
.EXAMPLE
PS C:\> Get-DbaRegServerGroup -SqlInstance sql2008 -Group hr\Seattle | Add-DbaRegServer -ServerName sql01111
Creates a registered server on sql2008's CMS which points to the SQL Server, sql01. When scrolling in CMS, the name "sql01" will be visible within the Seattle group which is in the hr group.
PS C:\> Connect-DbaInstance -SqlInstance dockersql1 -SqlCredential sqladmin | Add-DbaRegServer -ServerName mydockerjam
Creates a registered server called "mydockerjam" in Local Server Groups that uses SQL authentication and points to the server dockersql1.
#>
[CmdletBinding(SupportsShouldProcess)]
param (
[DbaInstanceParameter[]]$SqlInstance,
[PSCredential]$SqlCredential,
[parameter(Mandatory)]
[string]$ServerName,
[string]$Name = $ServerName,
[string]$Description,
[object]$Group,
[string]$ActiveDirectoryTenant,
[string]$ActiveDirectoryUserId,
[string]$ConnectionString,
[string]$OtherParams,
[parameter(ValueFromPipeline)]
[Microsoft.SqlServer.Management.RegisteredServers.ServerGroup[]]$InputObject,
[parameter(ValueFromPipeline)]
[Microsoft.SqlServer.Management.Smo.Server[]]$ServerObject,
[switch]$EnableException
)
process {
if (-not $InputObject -and -not $SqlInstance) {
Stop-Function -Message "You must either pipe in a registered server group or specify a sqlinstance"
# double check in case a null name was bound
if (-not $PSBoundParameters.ServerName -and -not $PSBoundParameters.ServerObject) {
Stop-Function -Message "You must specify either ServerName or ServerObject"
return
}

# double check in case a null name was bound
if (-not $Name) {
$Name = $ServerName
}

if (-not $SqlInstance -and -not $InputObject) {
Write-Message -Level Verbose -Message "Parsing local"
if (($Group)) {
if ($Group -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) {
$InputObject += Get-DbaRegServerGroup -Group $Group.Name
} else {
Write-Message -Level Verbose -Message "String group provided"
$InputObject += Get-DbaRegServerGroup -Group $Group
}
} else {
Write-Message -Level Verbose -Message "No group passed, getting root"
$InputObject += Get-DbaRegServerGroup -Id 1
}
}

foreach ($instance in $SqlInstance) {
if (($Group)) {
if ($Group -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) {
@@ -115,24 +153,56 @@ function Add-DbaRegServer {
}

foreach ($reggroup in $InputObject) {
$parentserver = Get-RegServerParent -InputObject $reggroup

if ($null -eq $parentserver) {
Stop-Function -Message "Something went wrong and it's hard to explain, sorry. This basically shouldn't happen." -Continue
if ($reggroup.Source -eq "Azure Data Studio") {
Stop-Function -Message "You cannot use dbatools to remove or add registered servers in Azure Data Studio" -Continue
}

$server = $reggroup.ParentServer

if ($Pscmdlet.ShouldProcess($parentserver.SqlInstance, "Adding $ServerName")) {
try {
$newserver = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer($reggroup, $Name)
$newserver.ServerName = $ServerName
$newserver.Description = $Description
$newserver.Create()

Get-DbaRegServer -SqlInstance $server -Name $Name -ServerName $ServerName
} catch {
Stop-Function -Message "Failed to add $ServerName on $($parentserver.SqlInstance)" -ErrorRecord $_ -Continue
if ($reggroup.ID) {
$target = $reggroup.ParentServer.SqlInstance
} else {
$target = "Local Registered Servers"
}
if ($Pscmdlet.ShouldProcess($target, "Adding $ServerName")) {

if ($ServerObject) {
foreach ($server in $ServerObject) {
if (-not $PSBoundParameters.Name) {
$Name = $server.Name
}
if (-not $PSBoundParameters.ServerName) {
$ServerName = $server.Name
}
try {
$newserver = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer($reggroup, $Name)
$newserver.ServerName = $ServerName
$newserver.Description = $Description
$newserver.ConnectionString = $server.ConnectionContext.ConnectionString
$newserver.SecureConnectionString = $server.ConnectionContext.SecureConnectionString
$newserver.ActiveDirectoryTenant = $ActiveDirectoryTenant
$newserver.ActiveDirectoryUserId = $ActiveDirectoryUserId
$newserver.OtherParams = $OtherParams
$newserver.CredentialPersistenceType = "PersistLoginNameAndPassword"
$newserver.Create()

Get-DbaRegServer -SqlInstance $reggroup.ParentServer -Name $Name -ServerName $ServerName
} catch {
Stop-Function -Message "Failed to add $ServerName on $target" -ErrorRecord $_ -Continue
}
}
} else {
try {
$newserver = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer($reggroup, $Name)
$newserver.ServerName = $ServerName
$newserver.Description = $Description
$newserver.ConnectionString = $ConnectionString
$newserver.ActiveDirectoryTenant = $ActiveDirectoryTenant
$newserver.ActiveDirectoryUserId = $ActiveDirectoryUserId
$newserver.OtherParams = $OtherParams
$newserver.Create()

Get-DbaRegServer -SqlInstance $reggroup.ParentServer -Name $Name -ServerName $ServerName
} catch {
Stop-Function -Message "Failed to add $ServerName on $target" -ErrorRecord $_ -Continue
}
}
}
}
@@ -77,10 +77,6 @@ function Add-DbaRegServerGroup {
[switch]$EnableException
)
process {
if (-not $InputObject -and -not $SqlInstance) {
Stop-Function -Message "You must either pipe in a registered server group or specify a sqlinstance"
return
}
foreach ($instance in $SqlInstance) {
if ((Test-Bound -ParameterName Group)) {
$InputObject += Get-DbaRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group
@@ -89,24 +85,37 @@ function Add-DbaRegServerGroup {
}
}

if (-not $SqlInstance -and -not $InputObject) {
if ((Test-Bound -ParameterName Group)) {
$InputObject += Get-DbaRegServerGroup -Group $Group
} else {
$InputObject += Get-DbaRegServerGroup -Id 1
}
}

foreach ($reggroup in $InputObject) {
$parentserver = Get-RegServerParent -InputObject $reggroup
$server = $reggroup.ParentServer
if ($reggroup.Source -eq "Azure Data Studio") {
Stop-Function -Message "You cannot use dbatools to remove or add registered server groups in Azure Data Studio" -Continue
}

if ($null -eq $parentserver) {
Stop-Function -Message "Something went wrong and it's hard to explain, sorry. This basically shouldn't happen." -Continue
if ($reggroup.ID) {
$target = $reggroup.Parent
} else {
$target = "Local Registered Server Groups"
}

if ($Pscmdlet.ShouldProcess($parentserver.SqlInstance, "Adding $Name")) {
if ($Pscmdlet.ShouldProcess($target, "Adding $Name")) {
try {
$newgroup = New-Object Microsoft.SqlServer.Management.RegisteredServers.ServerGroup($reggroup, $Name)
$newgroup.Description = $Description
$newgroup.Create()

Get-DbaRegServerGroup -SqlInstance $server -Group (Get-RegServerGroupReverseParse -object $newgroup)
$parentserver.ServerConnection.Disconnect()
Get-DbaRegServerGroup -SqlInstance $reggroup.ParentServer -Group (Get-RegServerGroupReverseParse -object $newgroup)
if ($parentserver.ServerConnection) {
$parentserver.ServerConnection.Disconnect()
}
} catch {
Stop-Function -Message "Failed to add $reggroup on $server" -ErrorRecord $_ -Continue
Stop-Function -Message "Failed to add $reggroup" -ErrorRecord $_ -Continue
}
}
}
@@ -62,25 +62,32 @@ function Get-DbaRegServerGroup {
#>
[CmdletBinding()]
param (
[parameter(Mandatory, ValueFromPipeline)]
[parameter(ValueFromPipeline)]
[DbaInstanceParameter[]]$SqlInstance,
[PSCredential]$SqlCredential,
[object[]]$Group,
[object[]]$ExcludeGroup,
[int[]]$Id,
[switch]$EnableException
)
begin {
$serverstores = $groups = @()
}
process {
foreach ($instance in $SqlInstance) {
try {
$serverstore = Get-DbaRegServerStore -SqlInstance $instance -SqlCredential $SqlCredential -EnableException
$serverstores += Get-DbaRegServerStore -SqlInstance $instance -SqlCredential $SqlCredential -EnableException
} catch {
Stop-Function -Message "Cannot access Central Management Server '$instance'" -ErrorRecord $_ -Continue
}
}

$groups = @()
if (-not $SqlInstance) {
$serverstores += Get-DbaRegServerStore
}

if ($group) {
foreach ($serverstore in $serverstores) {
if ($Group) {
foreach ($currentgroup in $Group) {
Write-Message -Level Verbose -Message "Processing $currentgroup"
if ($currentgroup -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) {
@@ -137,19 +144,26 @@ function Get-DbaRegServerGroup {
if ($Id) {
Write-Message -Level Verbose -Message "Filtering for id $Id. Id 1 = default."
if ($Id -eq 1) {
$groups = $serverstore.DatabaseEngineServerGroup | Where-Object Id -in $Id
$groups = $serverstore.DatabaseEngineServerGroup
} else {
$groups = $serverstore.DatabaseEngineServerGroup.GetDescendantRegisteredServers().Parent | Where-Object Id -in $Id
}
}
$serverstore.ServerConnection.Disconnect()
if ($serverstore.ServerConnection) {
$serverstore.ServerConnection.Disconnect()
}

foreach ($groupobject in $groups) {
Add-Member -Force -InputObject $groupobject -MemberType NoteProperty -Name ComputerName -value $serverstore.ComputerName
Add-Member -Force -InputObject $groupobject -MemberType NoteProperty -Name InstanceName -value $serverstore.InstanceName
Add-Member -Force -InputObject $groupobject -MemberType NoteProperty -Name SqlInstance -value $serverstore.SqlInstance
Add-Member -Force -InputObject $groupobject -MemberType NoteProperty -Name ParentServer -value $serverstore.ParentServer

Select-DefaultView -InputObject $groupobject -Property ComputerName, InstanceName, SqlInstance, Name, DisplayName, Description, ServerGroups, RegisteredServers
if ($groupobject.ComputerName) {
Select-DefaultView -InputObject $groupobject -Property ComputerName, InstanceName, SqlInstance, Name, DisplayName, Description, ServerGroups, RegisteredServers
} else {
Select-DefaultView -InputObject $groupobject -Property Name, DisplayName, Description, ServerGroups, RegisteredServers
}
}
}
}
@@ -42,7 +42,7 @@ function Get-DbaRegServerStore {
#>
[CmdletBinding()]
param (
[parameter(Mandatory, ValueFromPipeline)]
[parameter(ValueFromPipeline)]
[DbaInstanceParameter[]]$SqlInstance,
[PSCredential]$SqlCredential,
[switch]$EnableException
@@ -67,5 +67,17 @@ function Get-DbaRegServerStore {
Add-Member -Force -InputObject $store -MemberType NoteProperty -Name ParentServer -value $server
Select-DefaultView -InputObject $store -ExcludeProperty ServerConnection, DomainInstanceName, DomainName, Urn, Properties, Metadata, Parent, ConnectionContext, PropertyMetadataChanged, PropertyChanged, ParentServer
}

# Magic courtesy of Mathias Jessen and David Shifflet
if (-not $PSBoundParameters.SqlInstance) {
$file = [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore]::LocalFileStore.DomainInstanceName
if ($file) {
if ((Test-Path -Path $file)) {
$class = [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore]
$initMethod = $class.GetMethod('InitChildObjects', [Reflection.BindingFlags]'Static,NonPublic')
$initMethod.Invoke($null, @($file))
}
}
}
}
}
@@ -1,10 +1,10 @@
function Move-DbaRegServer {
<#
.SYNOPSIS
Moves registered servers around SQL Server Central Management Server (CMS)
Moves registered servers around SQL Server Central Management Server (CMS). Local Registered Servers not currently supported.
.DESCRIPTION
Moves registered servers around SQL Server Central Management Server (CMS)
Moves registered servers around SQL Server Central Management Server (CMS). Local Registered Servers not currently supported.
.PARAMETER SqlInstance
The target SQL Server instance or instances.
@@ -1,10 +1,10 @@
function Move-DbaRegServerGroup {
<#
.SYNOPSIS
Moves registered server groups around SQL Server Central Management Server (CMS).
Moves registered server groups around SQL Server Central Management Server (CMS). Local Registered Server Groups not currently supported.
.DESCRIPTION
Moves registered server groups around SQL Server Central Management Server (CMS).
Moves registered server groups around SQL Server Central Management Server (CMS). Local Registered Server Groups not currently supported.
.PARAMETER SqlInstance
The target SQL Server instance or instances.

0 comments on commit ac6fc48

Please sign in to comment.
You can’t perform that action at this time.