Если вы хотите что-то, что будет полезно в будущем, я, вероятно, воздержусь от попыток поиска в реестре. Ульи для 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
свойство к выводу, чтобы включить фактическое имя сервера, возвращающее информацию, делаю это для других функций, просто обычно не использую это для более чем одного сервера за раз, поэтому это ускользнуло от меня.