Jeśli chcesz czegoś, co będzie przydatne w przyszłości, prawdopodobnie unikałbym przeszukiwania rejestru. Ule dla SQL Server zmieniły się nieco na przestrzeni lat i nadążanie za nimi może być kłopotliwe.
Metoda z SqlDataSourceEnumeratorczasem jest niestabilna i chociaż jej użyję, nie ma konkretnych dowodów na to, że instancje są w sieci. Uważam, że zależy to również od usługi przeglądarki SQL, która przez większość czasu jest wyłączona.
Wykorzystam klasę WMI win32_Service. Używam tego, ponieważ oferuje więcej informacji o usłudze niż Get-Servicecmdlet.
Piszę wszystko jako funkcje ogólnie, ponieważ można tego użyć do codziennego sprawdzania lub weryfikacji usługi w celu rozwiązania problemów.
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
}
}
}
To trochę więcej niż zwykle używam, ale na wypadek, gdyby ktoś inny się zetknął i chciałby z niego skorzystać. Jest to Test-Connectionrównoznaczne z ping myserverpoleceniem DOS, a -Quietflaga po prostu zwraca ją truelub false. Będzie to domyślnie 4 pingi, więc ustawienie -Count 2powoduje, że zamiast tego zrobi to dwa razy.
Zmienna [string[]]$serverjest metodą stosowaną do stwierdzenia, że $serverzaakceptuje tablicę nazw serwerów. Przykładowe wywołanie tej funkcji może wyglądać mniej więcej tak:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
lub
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
EDYTOWAĆ
Zauważony komentarz jest taki, że powyższe zależy od dostarczonej listy serwerów. W przypadkach, w których nie ma tej listy, masz kilka innych opcji.
Jeśli jestem w środowisku Active Directory, mogę użyć modułu ActiveDirectory w PowerShell, aby pobrać listę wszystkich serwerów w domenie za pomocą polecenia Get-ADComputercmdlet. Słowo ostrzeżenia jednak upewnij się, że używasz dobra -Filterw dużych domenach.
Po prostu wykonałem również skanowanie IP (za zgodą) sieci, która daje mi adresy IP, na których znaleziono port 1433. Wezmę tę listę adresów IP i wykorzystam Get-ADComputerdo znalezienia nazw komputerów w domenie, a następnie przekażę to do powyższej funkcji
Przykład:
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
EDYTOWAĆ
Sugerowana edycja do wykorzystania, Write-Verbosea także dodania w bloku try / catch, chociaż może to być przydatne, aw większości przypadków praktyka kodu, pozostawię to osobie, która chce użyć tej funkcji, aby dodać ten dodatkowy kod lub funkcjonalność. Po prostu próbuję podać podstawowy przykład. Dodałem SystemNamewłaściwość do danych wyjściowych, aby uwzględnić rzeczywiste informacje o zwrocie nazwy serwera, zrób to na innych funkcjach, ale na ogół nie używaj tego dla więcej niż jednego serwera na raz, więc o tym pomyślałem.