Мне было поручено обнаружить все экземпляры SQL Server, которые работают в нашем домене. В нескольких случаях существует несколько экземпляров на сервер. Я видел два разных метода PowerShell для нахождения этих экземпляров, но ни один из них не находит все экземпляры.
1) Используйте WMI
$srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName
$instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}}
return $instances
2) Используйте удаленный реестр (как с Get-SQLInstance 1 )
Самая большая проблема, с которой я сталкиваюсь, заключается в том, что не все серверы, о которых я знаю, работают с поставщиком WMI SQL Server, и не все они допускают удаленный реестр. Есть ли третий способ? Я могу использовать удаленный рабочий стол для доступа ко всем серверам, но я смотрю примерно на 30 машин и хотел бы по возможности избегать ручных действий. Это необходимо только для работы с SQL Server 2008 и более поздними версиями, и хотя было бы неплохо узнать о других службах SQL Server (SSIS / SSAS / SSRS), основное внимание уделяется самому SQL Server.
источник
Ответы:
Если вы хотите что-то, что будет полезно в будущем, я, вероятно, воздержусь от попыток поиска в реестре. Ульи для SQL Server несколько изменились за эти годы, и это может быть хлопотно, чтобы не отставать.
Время от времени метод
SqlDataSourceEnumerator
является нестабильным, и хотя я буду его использовать, нет конкретных доказательств того, что экземпляры находятся в сети. Я считаю, что это также зависит от службы браузера SQL, которая в большинстве случаев оказывается отключенной.Я буду использовать класс WMI
win32_Service
. Я использую это, потому что он предоставляет больше информации об услуге, чемGet-Service
командлет.Обычно я пишу все как функции, потому что вы можете использовать это, чтобы фактически выполнять ежедневную проверку или проверку службы для устранения неполадок.
Это немного больше, чем я обычно использую, но в случае, если кто-то еще сталкивается и хочет использовать это. Значение
Test-Connection
равноping myserver
в приглашении DOS, и-Quiet
флаг просто возвращает егоtrue
илиfalse
. По умолчанию это будет 4 пинга, поэтому настройка-Count 2
просто заставляет его делать это дважды.Переменная
[string[]]$server
- это метод, используемый для определения состояния, которое$server
будет принимать массив имен серверов. Поэтому пример вызова этой функции может выглядеть примерно так:или
РЕДАКТИРОВАТЬ
Отмеченный комментарий заключается в том, что вышесказанное зависит от списка предоставляемых серверов. В тех случаях, когда мне не предоставлен этот список, у вас есть несколько других вариантов.
Если я нахожусь в среде Active Directory, я могу использовать модуль ActiveDirectory в PowerShell, чтобы получить список всех серверов в домене с помощью
Get-ADComputer
командлета. Слово предупреждения, хотя убедитесь, что вы используете товар-Filter
на больших доменах.Я также просто сделал сканирование IP (с одобрения) сети, которая дает мне IP-адреса, где был найден открытый порт 1433. Я возьму этот список IP и использую его
Get-ADComputer
для поиска доменных имен компьютеров, а затем передам в функцию выше.Пример:
РЕДАКТИРОВАТЬ
Предлагаемое редактирование для использования,
Write-Verbose
а также добавления в блок try / catch, хотя это может быть полезно, и в большинстве случаев в практике кода я оставляю это на усмотрение человека, который хочет использовать эту функцию для добавления этого дополнительного кода или функциональности. Просто пытаюсь привести простой пример. Я добавилSystemName
свойство к выводу, чтобы включить фактическое имя сервера, возвращающее информацию, делаю это для других функций, просто обычно не использую это для более чем одного сервера за раз, поэтому это ускользнуло от меня.источник
Единственный известный мне способ обнаружения экземпляров в среде, не зная всех возможных владельцев серверов и их конкретных имен, - это вызвать System.Data.Sql.SqlDataSourceEnumerator.GetDataSources (). Однако этот метод содержит много сносок. Вот фрагмент, который извлекается непосредственно из этого ресурса MSDN:
Вызов прост от PowerShell:
Этот метод возвращает
DataTable
объект, который вы можете обрабатывать соответствующим образом.источник
Если служба браузера SQL активна, вы можете запросить у службы инстансы SQL с помощью приведенного ниже кода PowerShell. Он реализует следующие командлеты для выполнения запросов:
Get-SqlBrowserInstanceDac
источник
Еще один способ определения возможных экземпляров SQL - посмотреть на имена принципов обслуживания (SPN), перечисленные в Active Directory. При удаленном подключении к SQL Server с помощью проверки подлинности Windows в процессе проверки подлинности используется имя участника-службы. Наличие имени участника-службы не означает, что сервер / экземпляр определенно существует и работает, но оно дает вам список возможных экземпляров, которые, как я обнаружил, являются более полными, чем некоторые другие подходы.
Чтобы упростить жизнь, я использую командлет Get-SPN: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a
Загрузите скрипт Get-SPN.ps1, сохраните его в C: \ powershell_scripts \ Get-SPN.ps1 и запустите в PowerShell следующее:
(Очевидно, что вы можете сохранить скрипт в другом месте, просто обновите первую строку по мере необходимости.)
В этом списке будут перечислены все имена участников-служб SQL Server в текущем домене, включая «спецификацию», относящуюся к порту / экземпляру службы.
источник
Get-Service -ComputerName * MSSQL * | Where-Object {$ _. Status -eq "Running"}
Это должно получить именованные и стандартные экземпляры. Просто повторите ваш список машин и т. Д.
источник
Только что попробовал это: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()
Возвращено не так много данных, но он обнаружил все серверы sql, которые я использую в среде виртуальных машин.
источник