Zadanie polegało mi na odkryciu wszystkich wystąpień SQL Server, które działają w naszej domenie. W kilku przypadkach istnieje wiele wystąpień na serwer. Widziałem dwie różne metody wyszukiwania tych wystąpień w PowerShell, ale żadna z nich nie wydaje się znajdować wszystkich.
1) Użyj WMI
$srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName
$instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}}
return $instances
2) Użyj zdalnego rejestru (jak w Get-SQLInstance 1 )
Największym problemem, na jaki się natknęłam, jest to, że nie wszystkie serwery, o których wiem, działają z dostawcą WMI programu SQL Server, ani nie wszystkie zezwalają na zdalny rejestr. Czy istnieje trzecia metoda? Mogę użyć Pulpitu zdalnego, aby uzyskać dostęp do wszystkich serwerów, ale patrzę na około 30 komputerów i chciałbym w miarę możliwości unikać ręcznych kroków. To musi działać tylko w SQL Server 2008 i nowszych wersjach i chociaż dobrze byłoby wiedzieć o innych usługach SQL Server (SSIS / SSAS / SSRS), moim głównym celem jest sam SQL Server.
źródło
Odpowiedzi:
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.
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 zping myserver
poleceniem DOS, a-Quiet
flaga po prostu zwraca jątrue
lubfalse
. 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:lub
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 funkcjiPrzykład:
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łemSystemName
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.źródło
Jedynym sposobem, w jaki znam wykrywanie instancji w środowisku bez znajomości wszystkich możliwych serwerów będących ich właścicielami i ich konkretnych nazw, byłoby wywołanie funkcji System.Data.Sql.SqlDataSourceEnumerator.GetDataSources (). Ta metoda ma jednak wiele przypisów. Oto fragment, który jest pobierany bezpośrednio z tego zasobu MSDN:
Wywołanie jest proste z PowerShell:
Ta metoda zwraca
DataTable
obiekt, który można odpowiednio obsłużyć.źródło
Jeśli usługa przeglądarki SQL jest aktywna, możesz wysłać zapytanie do usługi o wystąpienia SQL za pomocą poniższego kodu PowerShell. Implementuje następujące komendy do wykonywania zapytań:
Get-SqlBrowserInstanceDac
źródło
Innym sposobem identyfikacji możliwych wystąpień SQL jest sprawdzenie nazw zasad usługi (SPN) wymienionych w usłudze Active Directory. Kiedy łączysz się z SQL Server zdalnie za pomocą uwierzytelniania systemu Windows, w procesie uwierzytelniania używana jest nazwa SPN. Obecność nazwy SPN nie oznacza, że serwer / instancja jest zdecydowanie dostępna i działa, ale daje listę możliwych instancji, które według mnie są bardziej wyczerpujące w porównaniu z innymi podejściami.
Aby ułatwić życie, używam polecenia cmdlet Get-SPN z: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a
Pobierz skrypt Get-SPN.ps1, zapisz go w C: \ powershell_scripts \ Get-SPN.ps1 i uruchom następujące polecenie w PowerShell:
(Oczywiście możesz zapisać skrypt w innej lokalizacji, wystarczy zaktualizować pierwszy wiersz zgodnie z wymaganiami).
Spowoduje to wyświetlenie wszystkich nazw SPN programu SQL Server w bieżącej domenie, w tym „specyfikacji” odnoszącej się do portu / instancji usługi.
źródło
Get-Service -ComputerName * MSSQL * | Where-Object {$ _. Status -eq „Running”}
To powinno być nazwane i domyślne wystąpienia. Wystarczy powtórzyć listę maszyn itp.
źródło
Właśnie próbowałem tego: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()
Nie zwrócono zbyt wielu danych, ale wykryło wszystkie serwery SQL uruchomione w środowisku VM.
źródło