functions/DynamicParams.ps1
<# These are all the functions for tab completion (auto-population of params) To use, place this after params in a function DynamicParam { if ($source) { return (Get-ParamSqlXyz -SqlServer $Source -SqlCredential $SourceSqlCredential) } } #> Function Get-ParamSqlServerConfigs { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Server Configs from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $configlist = @() $server.Configuration.ShowAdvancedOptions.ConfigValue = $true $null = $server.ConnectionContext.ExecuteNonQuery("RECONFIGURE WITH OVERRIDE") $configlist = $server.Configuration.PsObject.Properties.Name | Where-Object { $_ -notin "Parent", "Properties" } $server.Configuration.ShowAdvancedOptions.ConfigValue = $false $null = $server.ConnectionContext.ExecuteNonQuery("RECONFIGURE WITH OVERRIDE") # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($configlist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $configlist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($configlist) { $attributeCollection.Add($validationset) } $Configs = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Configs", [String[]], $attributeCollection) $newparams.Add("Configs", $Configs) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlDatabases { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with database list from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $SupportDbs = "ReportServer", "ReportServerTempDb", "distribution" # Populate arrays $databaselist = @() foreach ($database in $server.databases) { if ((!$database.IsSystemObject) -and $SupportDbs -notcontains $database.name) { $databaselist += $database.name } } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute # Provide backwards compatability for improperly named parameter # Scratch that. I'm going with plural. Sorry, Snoves! $alias = New-Object System.Management.Automation.AliasAttribute "Database" $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($databaselist) { $dbvalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $databaselist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($databaselist) { $attributeCollection.Add($dbvalidationset) } $attributeCollection.Add($alias) $Databases = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Databases", [String[]], $attributeCollection) $dbexcludeattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $dbexcludeattributes.Add($attributes) if ($databaselist) { $dbexcludeattributes.Add($dbvalidationset) } $Exclude = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Exclude", [String[]], $dbexcludeattributes) $newparams.Add("Databases", $Databases) $newparams.Add("Exclude", $Exclude) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlLogins { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with login list from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $loginlist = @() foreach ($login in $server.logins) { if (!$login.name.StartsWith("##") -and $login.name -ne 'sa') { $loginlist += $login.name } } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute # Provide backwards compatability for improperly named parameter # Scratch that. I'm going with plural. Sorry, Snoves! $alias = New-Object System.Management.Automation.AliasAttribute "Login" $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Login list parameter setup if ($loginlist) { $loginvalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $loginlist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($loginlist) { $attributeCollection.Add($loginvalidationset) } $attributeCollection.Add($alias) $Logins = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Logins", [String[]], $attributeCollection) $excludeattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $excludeattributes.Add($attributes) if ($loginlist) { $excludeattributes.Add($loginvalidationset) } $Exclude = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Exclude", [String[]], $excludeattributes) $newparams.Add("Logins", $Logins) $newparams.Add("Exclude", $Exclude) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlServerRoles { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Server Roles from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $rolelist = @() $roles = $server.roles | Where-Object { $_.IsFixedRole -eq $false -and $_.Name -ne 'public' } foreach ($role in $roles) { $rolelist += $role.name } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($rolelist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $rolelist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($rolelist) { $attributeCollection.Add($validationset) } $roles = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Roles", [String[]], $attributeCollection) $newparams.Add("Roles", $roles) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlCredentials { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with SQL Credentials from specified SQL Server server name. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $credentiallist = @() foreach ($credential in $server.credentials) { $credentiallist += $credential.name } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($credentiallist) { $dbvalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $credentiallist } $lsattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $lsattributes.Add($attributes) if ($credentiallist) { $lsattributes.Add($dbvalidationset) } $Credentials = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Credentials", [String[]], $lsattributes) $newparams.Add("Credentials", $Credentials) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlServerAudits { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Server Audits from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $auditlist = @() foreach ($audit in $server.audits) { $auditlist += $audit.name } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($auditlist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $auditlist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($auditlist) { $attributeCollection.Add($validationset) } $audits = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Audits", [String[]], $attributeCollection) $newparams.Add("Audits", $audits) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlServerServerAuditSpecifications { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Server ServerAuditSpecifications from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $auditspeclist = @() foreach ($auditspec in $server.ServerAuditSpecifications) { $auditspeclist += $auditspecname } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($auditspeclist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $auditspeclist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($auditspeclist) { $attributeCollection.Add($validationset) } $serverAuditSpecifications = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("ServerAuditSpecifications", [String[]], $attributeCollection) $newparams.Add("ServerAuditSpecifications", $serverAuditSpecifications) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlBackupDevices { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Backup Devices from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $backupdevicelist = @() foreach ($backupdevice in $server.BackupDevices) { $backupdevicelist += $backupdevice.name } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($backupdevicelist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $backupdevicelist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($backupdevicelist) { $attributeCollection.Add($validationset) } $backupdevices = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("BackupDevices", [String[]], $attributeCollection) $newparams.Add("BackupDevices", $backupdevices) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlServerEndpoints { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Server Endpoints from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $endpointlist = @() $usernedponit = $server.Endpoints | Where-Object { $_.IsSystemObject -eq $false } foreach ($endpoint in $server.Endpoints) { $endpointlist += $endpointname } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($endpointlist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $endpointlist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($endpointlist) { $attributeCollection.Add($validationset) } $Endpoints = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Endpoints", [String[]], $attributeCollection) $newparams.Add("Endpoints", $Endpoints) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlLinkedServers { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Linked Servers from specified server name. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $linkedserverlist = @() foreach ($linkedserver in $server.LinkedServers) { # skip the replication linked server if ($linkedserver.name -ne 'repl_distributor') { $linkedserverlist += $linkedserver.name } } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($linkedserverlist) { $dbvalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $linkedserverlist } $lsattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $lsattributes.Add($attributes) if ($linkedserverlist) { $lsattributes.Add($dbvalidationset) } $LinkedServers = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("LinkedServers", [String[]], $lsattributes) $newparams.Add("LinkedServers", $LinkedServers) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlPolicyManagement { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Sql Policy Management objects from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $sqlconn = $server.ConnectionContext.SqlConnectionObject $sqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $sqlconn # DMF is the Declarative Management Framework, Policy Based Management's old name $store = New-Object Microsoft.SqlServer.Management.DMF.PolicyStore $sqlStoreConnection $objects = "Policies", "Conditions" # Maybe other stuff later? I don't know PBM well enough yet to know. $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 foreach ($name in $objects) { $items = $store.$name.Name if ($items.count -gt 0) { $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) $attributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $items)) } $newparams.Add($name, (New-Object -Type System.Management.Automation.RuntimeDefinedParameter($name, [String[]], $attributeCollection))) } $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlResourceGovernor { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Resource Governor objects from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $pools = $server.ResourceGovernor.ResourcePools | Where-Object { $_.Name -notin "internal", "default" } if ($pools.count -gt 0) { $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) $attributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $pools.Name)) $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $newparams.Add("ResourcePools", (New-Object -Type System.Management.Automation.RuntimeDefinedParameter("ResourcePools", [String[]], $attributeCollection))) } $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlExtendedEvents { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Extended Event objects from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $sqlconn = $server.ConnectionContext.SqlConnectionObject $sqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $sqlconn $store = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $sqlStoreConnection $objects = "Sessions" # Maybe packages later? I don't understand xEvents well enough yet to know. $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 foreach ($name in $objects) { $items = $store.$name.Name if ($items.count -gt 0) { $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) $attributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $items)) } $newparams.Add($name, (New-Object -Type System.Management.Automation.RuntimeDefinedParameter($name, [String[]], $attributeCollection))) } $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlDatabaseMail { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Database Mail server objects from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $objects = "ConfigurationValues", "Profiles", "Accounts", "MailServers" $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 foreach ($name in $objects) { if ($name -eq "MailServers") { $items = $server.Mail.Accounts.$name.Name } else { $items = $server.Mail.$name.Name } if ($items.count -gt 0) { $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) $attributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $items)) } $newparams.Add($name, (New-Object -Type System.Management.Automation.RuntimeDefinedParameter($name, [String[]], $attributeCollection))) } $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlJobServer { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with job server objects from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $jobobjects = "ProxyAccounts", "JobSchedule", "SharedSchedules", "AlertSystem", "JobCategories", "OperatorCategories" $jobobjects += "AlertCategories", "Alerts", "TargetServerGroups", "TargetServers", "Operators", "Jobs", "Mail" $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 foreach ($name in $jobobjects) { $items = $server.JobServer.$name.Name if ($items.count -gt 0) { $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) $attributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $items)) } $newparams.Add($name, (New-Object -Type System.Management.Automation.RuntimeDefinedParameter($name, [String[]], $attributeCollection))) } $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlCmsGroups { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with server groups from specified SQL Server Central Management server name. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $SqlCms = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $sqlconnection = $SqlCms.ConnectionContext.SqlConnectionObject try { $cmstore = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore($sqlconnection) } catch { return } if ($cmstore -eq $null) { return } $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $paramattributes = New-Object System.Management.Automation.ParameterAttribute $paramattributes.ParameterSetName = "__AllParameterSets" $paramattributes.Mandatory = $false $paramattributes.Position = 3 $argumentlist = $cmstore.DatabaseEngineServerGroup.ServerGroups.name if ($argumentlist -ne $null) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $argumentlist $combinedattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $combinedattributes.Add($paramattributes) $combinedattributes.Add($validationset) $SqlCmsGroups = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("SqlCmsGroups", [String[]], $combinedattributes) $newparams.Add("SqlCmsGroups", $SqlCmsGroups) return $newparams } else { return } } Function Get-ParamSqlServerTriggers { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Server Triggers from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $triggerlist = @() foreach ($trigger in $server.Triggers) { $triggerlist += $trigger.name } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($triggerlist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $triggerlist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($triggerlist) { $attributeCollection.Add($validationset) } $Triggers = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Triggers", [String[]], $attributeCollection) $newparams.Add("Triggers", $Triggers) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlCustomErrors { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with ID of Server Custom Errors/User Defined Messages from specified SQL Server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $messagelist = @() $uniquemessageid = $server.UserDefinedMessages | Select ID | Sort-Object | Get-Unique foreach ($message in $uniquemessageid) { $messagelist += $message.ID } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($messagelist) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $messagelist } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($messagelist) { $attributeCollection.Add($validationset) } $CustomErrors = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("CustomErrors", [String[]], $attributeCollection) $newparams.Add("CustomErrors", $CustomErrors) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlDatabaseAssemblies { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with assemblies from specified SQL Server. Assembly name is in database.assemblyname format. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } ######### Assemblies $list = @() foreach ($database in $server.Databases) { try { # a bug here requires a try/catch $userAssemblies = $($database.assemblies | Where-Object { $_.isSystemObject -eq $false }) foreach ($assembly in $userAssemblies) { $name = "$($database.name).$($assembly.name)" $list += $name } } catch { } } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $Assemblies = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Assemblies", [String[]], $attributeCollection) $newparams.Add("Assemblies", $Assemblies) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlDataCollectionSets { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Collection Sets from specified SQL Server's Data Collection object. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $sqlconn = $server.ConnectionContext.SqlConnectionObject $storeconn = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $sqlconn $store = New-Object Microsoft.SqlServer.Management.Collector.CollectorConfigStore $storeconn # Populate arrays $list = @() $collectionsets = $store.CollectionSets | Where-Object { $_.isSystem -eq $false } foreach ($collectionset in $collectionsets) { $list += $collectionset.name } # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $CollectionSets = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("CollectionSets", [String[]], $attributeCollection) $newparams.Add("CollectionSets", $CollectionSets) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlAlerts { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Alerts from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = $server.JobServer.Alerts.Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $Alerts = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Alerts", [String[]], $attributeCollection) $newparams.Add("Alerts", $Alerts) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlOperators { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Operators from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = $server.JobServer.Operators.Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $Operators = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Operators", [String[]], $attributeCollection) $newparams.Add("Operators", $Operators) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlOperatorCategories { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with OperatorCategories from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = ($server.JobServer.OperatorCategories | Where-Object { $_.ID -ge 100 }).Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $OperatorCategories = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("OperatorCategories", [String[]], $attributeCollection) $newparams.Add("OperatorCategories", $OperatorCategories) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlProxyAccounts { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with ProxyAccounts from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = $server.JobServer.ProxyAccounts.Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $ProxyAccounts = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("ProxyAccounts", [String[]], $attributeCollection) $newparams.Add("ProxyAccounts", $ProxyAccounts) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlSharedSchedules { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with SharedSchedules from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = $server.JobServer.SharedSchedules.Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $SharedSchedules = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("SharedSchedules", [String[]], $attributeCollection) $newparams.Add("SharedSchedules", $SharedSchedules) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlJobCategories { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with JobCategories from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = ($server.JobServer.JobCategories | Where-Object { $_.ID -ge 100 }).Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $JobCategories = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("JobCategories", [String[]], $attributeCollection) $newparams.Add("JobCategories", $JobCategories) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlAlertCategories { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with AlertCategories from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = ($server.JobServer.AlertCategories | Where-Object { $_.ID -ge 100 }).Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $AlertCategories = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("AlertCategories", [String[]], $attributeCollection) $newparams.Add("AlertCategories", $AlertCategories) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlTargetServers { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with TargetServers from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = $server.JobServer.TargetServers.Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $TargetServers = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("TargetServers", [String[]], $attributeCollection) $newparams.Add("TargetServers", $TargetServers) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlTargetServerGroups { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with TargetServerGroups from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = $server.JobServer.TargetServerGroups.Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $TargetServerGroups = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("TargetServerGroups", [String[]], $attributeCollection) $newparams.Add("TargetServerGroups", $TargetServerGroups) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlJobs { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with Jobs from specified SQL Server Job Server (SQL Agent). #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } # Populate arrays $list = $server.JobServer.Jobs.Name # Reusable parameter setup $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 # Database list parameter setup if ($list) { $validationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $list } $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) if ($list) { $attributeCollection.Add($validationset) } $Jobs = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Jobs", [String[]], $attributeCollection) $newparams.Add("Jobs", $Jobs) $server.ConnectionContext.Disconnect() return $newparams } Function Get-ParamSqlAgentCategories { <# .SYNOPSIS Internal function. Returns System.Management.Automation.RuntimeDefinedParameterDictionary filled with job server objects from specified SQL Server server. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [object]$SqlServer, [System.Management.Automation.PSCredential]$SqlCredential ) try { $server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential -ParameterConnection } catch { return } $jobobjects = "JobCategories", "OperatorCategories", "AlertCategories" $newparams = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $attributes = New-Object System.Management.Automation.ParameterAttribute $attributes.ParameterSetName = "__AllParameterSets" $attributes.Mandatory = $false $attributes.Position = 3 foreach ($name in $jobobjects) { $items = ($server.JobServer.$name | Where-Object { $_.ID -ge 100 }).Name if ($items.count -gt 0) { $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute] $attributeCollection.Add($attributes) $attributeCollection.Add((New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $items)) } $newparams.Add($name, (New-Object -Type System.Management.Automation.RuntimeDefinedParameter($name, [String[]], $attributeCollection))) } return $newparams } |