Якщо ви хочете щось корисне для майбутнього, я, мабуть, уникатимуть спроб пошуку реєстру. Вулики для SQL Server протягом багатьох років дещо змінилися, і це може бути складно.
Метод із методом SqlDataSourceEnumerator
в'язаний часом, і хоча я буду його використовувати, не конкретні докази того, що екземпляри є в мережі. Я вважаю, що це залежить також від служби браузера SQL, яка більшість часу я вважаю відключеною.
Я буду використовувати клас WMI win32_Service
. Я використовую це, тому що він пропонує більше інформації про послугу, ніж Get-Service
cmdlet.
Я пишу все як функції, як правило, тому що ви можете використовувати це, щоб насправді просто щодня перевіряти або перевіряти службу для усунення несправностей.
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
}
}
}
Це трохи більше, ніж я зазвичай використовую, але у випадку, якщо хтось інший натрапив і захоче ним скористатися. У DOS-підказку Test-Connection
прирівнюється, ping myserver
і -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
EDIT
Зауважений коментар: вищезазначене залежить від списку наданих серверів. У випадках, коли мені не надано цей список, у вас є кілька інших варіантів.
Якщо я перебуваю в середовищі 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
EDIT
Пропоноване редагування для використання, Write-Verbose
а також додавання в блок "try / catch", хоча це може бути корисним, а в більшості випадків - кодовою практикою, я залишаю це особі, яка хоче використовувати цю функцію, щоб додати цей додатковий код або функціональність. Просто намагаюся надати основний приклад для продовження. Я додавав SystemName
властивість до висновку, щоб включати фактичну інформацію, що повертає ім'я сервера, роби це на інших функціях, просто, як правило, не використовую це для більше ніж одного сервера за один раз, так що це прослізнуло мені в голову.