В данном примере я покажу как с помощью 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("\")...).
Комментариев нет:
Отправить комментарий