Jedno z zadań administratora bazy danych, wykonywane zazwyczaj zaraz po zainstalowaniu SQL jest konfiguracja protokołów sieciowych. Mamy do skonfigurowania dwa rodzaje protokołów: protokoły klienckie oraz protokoły serwera. Zaczynamy od protokołów klienckich.
Oczywiście pierwszy krok to załadowanie SMO:
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")
$mc = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer localhost
I właściwie już jesteśmy u celu. Obiekt managed computer pozwala na odwołanie się do kolekcji ClientProtocols. Tak sprawdzisz, które protokoły są włączone:
$mc.ClientProtocols | Select Name, Urn, IsEnabled
Jeśli chcesz sprawdzić stan jednego protokołu. Wyślij wynik poprzedniego polecenia do Where-Object, a jeśli chcesz się odwoływać do tego protokołu w swoim skrypcie zapisz wynik w zmiennej:
$cp = $mc.ClientProtocols | Where { $_.name -eq 'np' }
Tak uzyskane obiekty pozwalają na modyfikowanie ustawień klienckich protokołów sieciowych z poziomu powershell. Aby wyłączyć protokół Named Pipes posłuż się instrukcją:
$cp.IsEnabled = $false $cp.Alter() $mc.Refresh()
Przypisanie wartości $false do właściwości IsEnabled zmienia tę właściwość tylko w zmiennej, nie na systemie. Polecenie Alter wysyła zmiany do serwera i od tej pory protokół jest rzeczywiście wyłączony. Polecenie Refresh odświeża obiekt, który sam nie śledzi możliwych zmian wykonywanych w systemie. Pora sprawdzić, czy protokół jest rzeczywiście wyłączony:
$mc.ClientProtocols | Select Name, Urn, IsEnabled
Naturalnie można pracować z protokołami jeden po drugim budując pętlę, ale to już mniej zasługa SMO, a raczej swoistego uroku powershell:
Foreach($protocol in $mc.ClientProtocols) { $protocol.name }
Teraz przyjrzyjmy się protokołom serwerowym. Jeśli na serwerze zainstalowano kilka instancji SQL, to dostępne protokoły konfiguruje się niezależnie dla każdej instancji. Dlatego pierwszy krok to znalezienie właściwej instancji. Instancje są przechowywane w kolekcji ServerInstances:
$mc.ServerInstances
Załóżmy, że interesuje nas instancja domyślna. Listę instancji można przefiltrować poleceniem Where-Object i instancję MSSQLSERVER zamamiętać w zmiennej:
$DefaultInstance = $mc.ServerInstances | Where {$_.Name -eq "MSSQLSERVER"}
I właściwie protokoły są już na wyciągnięcie ręki. Zawiera je kolekcja ServerProtocols:
$DefaultInstance.ServerProtocols | Select Name, Urn, IsEnabled
Aby odnaleźć ten jeden właściwy protokół posłużymy się znowu cmdletem Where-Object:
$sp = $DefaultInstance.ServerProtocols | where { $_.name -eq 'np'}
Jeśli trzeba, możesz teraz swobodnie modyfikować ustawienia tego protokołu. Tutaj wyłączamy protokół Named Pipes:
$sp.IsEnabled = $false
$sp.Alter()
Możesz też się spotkać z bardziej złożonymi metodami pracy z protokołami. W powyższych przykładach wyświetlając protokoły sieciowe wybierałem do wyświetlenia także URN. URN nie jest zbyt przyjazny, ale jeśli mu się przyjrzeć, nie jest aż taki skompilowany. Jeśli znasz URN możesz zadziałać w następujący sposób. Najpierw utwórz obiekt ManagedComputer
$mc = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer localhost
Teraz utwórz obiekt typu Urn wskazujący na właściwy protokół:
$urn = New-Object -TypeName Microsoft.SqlServer.Management.Sdk.Sfc.Urn -argumentlist ` "ManagedComputer[@Name='localhost']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='np']"
A teraz korzystając z adresu zapisanego w URN i obiektu ManagedComputer pobierz interesujący cie protokół:
$sp = $mc.GetSmoObject($urn)
Zróbmy podobną czynność jak poprzednio – włączymy protokół Named Pipes
$sp.IsEnabled = $true
$sp.Alter()
Jakby tego było mało, pracować z protokołami możesz też bez SMO, korzystając z obiektów WMI:
Tak pobierzesz informacje o protokole Named Pipes
Get-WmiObject -Namespace root\Microsoft\SqlServer\ComputerManagement12 -class ClientNetworkProtocol -Filter "ProtocolName = 'np'"
Tak wyłączysz protokół Named Pipes:
(Get-WmiObject -Namespace root\Microsoft\SqlServer\ComputerManagement12 -class ClientNetworkProtocol -Filter "ProtocolName = 'np'").SetDisable()
A tak ponownie go włączysz:
(Get-WmiObject -Namespace root\Microsoft\SqlServer\ComputerManagement12 -class ClientNetworkProtocol -Filter "ProtocolName = 'np'").SetEnable()
Chyba nie trudne, prawda?