Сравнения списка объектов SQL Server в PowerShell на примере сравнения логинов на двух серверахИсточник: msmvps
В данном примере я покажу как с помощью PowerShell можно сравнивать списки объектов на двух серверах на примере сравнения логинов: поиск одинаковых, поиск разницы. Для этого сначала выполним подключение к серверам. В данном примере первый сервер - локальный. К нему будем подключаться с использованием Windows аутентификации. #1. Загружаем SMO [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo ") / Out-Null #2. Подключаемся к серверу 1 (Windows аутентификация): $smoserver1 =new-object("Microsoft.SqlServer.Management.Smo.Server") "." #3. Подключаемся к Серверу 2 (аутентификация SQL Server): $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("\")) #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 По тому же принципу можно сравнивать списки и других объектов сервера, например заданий. #Для того, чтобы сравнить список заданий на двух серверах, можно воспользоваться 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". Это показано на рисунках ниже. Поэтому слеш нужно удалить. |