Если вы хотите что-то, что будет полезно в будущем, я, вероятно, воздержусь от попыток поиска в реестре. Ульи для SQL Server несколько изменились за эти годы, и это может быть хлопотно, чтобы не отставать.
Время от времени метод SqlDataSourceEnumeratorявляется нестабильным, и хотя я буду его использовать, нет конкретных доказательств того, что экземпляры находятся в сети. Я считаю, что это также зависит от службы браузера SQL, которая в большинстве случаев оказывается отключенной.
Я буду использовать класс WMI win32_Service. Я использую это, потому что он предоставляет больше информации об услуге, чем Get-Serviceкомандлет.
Обычно я пишу все как функции, потому что вы можете использовать это, чтобы фактически выполнять ежедневную проверку или проверку службы для устранения неполадок.
function Get-ServiceStatus ([string[]]$server)
{
foreach ($s in $server)
{
if(Test-Connection $s -Count 2 -Quiet)
{
Get-WmiObject win32_Service -Computer $s |
where {$_.DisplayName -match "SQL Server"} |
select SystemName, DisplayName, Name, State, Status, StartMode, StartName
}
}
}
Это немного больше, чем я обычно использую, но в случае, если кто-то еще сталкивается и хочет использовать это. Значение Test-Connectionравно ping myserverв приглашении DOS, и -Quietфлаг просто возвращает его trueили false. По умолчанию это будет 4 пинга, поэтому настройка -Count 2просто заставляет его делать это дважды.
Переменная [string[]]$server- это метод, используемый для определения состояния, которое $serverбудет принимать массив имен серверов. Поэтому пример вызова этой функции может выглядеть примерно так:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
или
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
РЕДАКТИРОВАТЬ
Отмеченный комментарий заключается в том, что вышесказанное зависит от списка предоставляемых серверов. В тех случаях, когда мне не предоставлен этот список, у вас есть несколько других вариантов.
Если я нахожусь в среде Active Directory, я могу использовать модуль ActiveDirectory в PowerShell, чтобы получить список всех серверов в домене с помощью Get-ADComputerкомандлета. Слово предупреждения, хотя убедитесь, что вы используете товар -Filterна больших доменах.
Я также просто сделал сканирование IP (с одобрения) сети, которая дает мне IP-адреса, где был найден открытый порт 1433. Я возьму этот список IP и использую его Get-ADComputerдля поиска доменных имен компьютеров, а затем передам в функцию выше.
Пример:
Import-Module ActiveDirectory
$sList = $ipList | Select -ExpandProperty IP
$results = foreach ($i in $sList) {
Get-ADComputer -Filter 'IPv4Address -eq $i' -Properties * | Select Name}
Get-ServiceStatus -server $results
РЕДАКТИРОВАТЬ
Предлагаемое редактирование для использования, Write-Verboseа также добавления в блок try / catch, хотя это может быть полезно, и в большинстве случаев в практике кода я оставляю это на усмотрение человека, который хочет использовать эту функцию для добавления этого дополнительного кода или функциональности. Просто пытаюсь привести простой пример. Я добавил SystemNameсвойство к выводу, чтобы включить фактическое имя сервера, возвращающее информацию, делаю это для других функций, просто обычно не использую это для более чем одного сервера за раз, поэтому это ускользнуло от меня.