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 SqlDataSourceEnumerator
czasem 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-Service
cmdlet.
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-Connection
równoznaczne z ping myserver
poleceniem DOS, a -Quiet
flaga po prostu zwraca ją true
lub false
. Będzie to domyślnie 4 pingi, więc ustawienie -Count 2
powoduje, że zamiast tego zrobi to dwa razy.
Zmienna [string[]]$server
jest metodą stosowaną do stwierdzenia, że $server
zaakceptuje 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-ADComputer
cmdlet. Słowo ostrzeżenia jednak upewnij się, że używasz dobra -Filter
w 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-ADComputer
do 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-Verbose
a 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 SystemName
wł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.