Якщо ви хочете щось корисне для майбутнього, я, мабуть, уникатимуть спроб пошуку реєстру. Вулики для SQL Server протягом багатьох років дещо змінилися, і це може бути складно.
Метод із методом SqlDataSourceEnumeratorв'язаний часом, і хоча я буду його використовувати, не конкретні докази того, що екземпляри є в мережі. Я вважаю, що це залежить також від служби браузера SQL, яка більшість часу я вважаю відключеною.
Я буду використовувати клас WMI win32_Service. Я використовую це, тому що він пропонує більше інформації про послугу, ніж Get-Servicecmdlet.
Я пишу все як функції, як правило, тому що ви можете використовувати це, щоб насправді просто щодня перевіряти або перевіряти службу для усунення несправностей.
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властивість до висновку, щоб включати фактичну інформацію, що повертає ім'я сервера, роби це на інших функціях, просто, як правило, не використовую це для більше ніж одного сервера за один раз, так що це прослізнуло мені в голову.