19.4.23

Сравнения списка объектов SQL Server в PowerShell на примере сравнения логинов на двух серверах

В данном примере я покажу как с помощью PowerShell можно сравнивать списки объектов на двух серверах на примере сравнения логинов: поиск одинаковых, поиск разницы. Для этого сначала выполним подключение к серверам. В данном примере первый сервер – локальный. К нему будем подключаться с использованием Windows аутентификации. Второй сервер – удаленный, к нему будем подключаться с использованием аутентификации SQL Server и запросом на ввод логина и пароля при подключении.

#1. Загружаем SMO

[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo ") | Out-Null

#2. Подключаемся к серверу 1 (Windows аутентификация):
#Сервер1-локальный
#Если нужен другой сервер, введите вместо точки IP-адрес \ имя сервера

$smoserver1 =new-object("Microsoft.SqlServer.Management.Smo.Server") "."

#3. Подключаемся к Серверу 2 (аутентификация SQL Server):
#В следующей строке нужно вписать IP-адрес сервера 2 либо имя сервера

$smoserver2 =new-object("Microsoft.SqlServer.Management.Smo.Server") "IP - адрес \ имя сервера2"

#Если аутентификация SQL Server, то значение FALSE, если Windows(по умолчанию) – TRUE

$smoServer2.ConnectionContext.set_LoginSecure($FALSE)

#Запрос ввода имени пользователя и пароля

$LoginCredentials = Get-Credential

#Устанавливаем свойства ConnectionContext

$smoServer2.ConnectionContext.set_EncryptConnection($FALSE)

#В конце поста я расскажу зачем в строке ниже убираем слеш из имени пользователя

$smoServer2.ConnectionContext.set_Login($LoginCredentials.UserName -replace("\"))
$smoServer2.ConnectionContext.set_SecurePassword($LoginCredentials.Password)

#4. Сравниваем логины
#Командлет выводит логины, которые есть на обоих серверах

compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) -includeequal | where-object {$_.SideIndicator -eq "=="} |select-object InputObject

#Командлет выводит логины, которые есть на сервере 2, но нет на сервере 1

compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) | where-object {$_.SideIndicator -eq "=>"} |select-object InputObject

#Командлет выводит логины, которые есть на сервере 1, но нет на сервере 2

compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) | where-object {$_.SideIndicator -eq "<="} |select-object InputObject

#Можно перенаправить вывод в файл

compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) -includeequal | where-object {$_.SideIndicator -eq "=="} |select-object InputObject > C:\Test.txt

По тому же принципу можно сравнивать списки и других объектов сервера, например заданий.

#Для того, чтобы сравнить список заданий на двух серверах, можно воспользоваться
#объектом SMOServer.JobServer.Jobs:

compare-object -referenceobject $($smoserver1.JobServer.Jobs) -differenceobject $($smoserver2. JobServer.Jobs)

Для получения справки по командлету compare-object, в окне powershell введите:

Get-help Compare-object -detailed

Иерархия объектов SMO приведена в документации по адресу: http://msdn.microsoft.com/ru-ru/library/ms162209.aspx

Теперь о том, почему мы убираем слеш из введенного имени пользователя (...-replace("\")...).

Командлет get-credential ждет ввода в формате Домен\Логин. В нашем примере мы используем его не для входа в домен, а для подключения к SQL Server и домен не вводим, поэтому, несмотря на то, что в окне запроса учетных данных я вводила логин “Inaumova”, свойству UserName присвоилось значение “\Inaumova”.

Комментариев нет:

Отправить комментарий