Ich wurde beauftragt, alle Instanzen von SQL Server zu ermitteln, die in unserer Domäne ausgeführt werden. In mehreren Fällen gibt es mehrere Instanzen pro Server. Ich habe zwei verschiedene PowerShell-Methoden zum Finden dieser Instanzen gesehen, aber keine scheint alle Instanzen zu finden.
1) Verwenden Sie 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) Verwenden Sie die Remoteregistrierung (wie bei Get-SQLInstance 1 ).
Das größte Problem, auf das ich stoße, ist, dass nicht alle Server, die ich kenne, mit dem SQL Server-WMI-Anbieter ausgeführt werden und auch keine Remoteregistrierung zulassen. Gibt es eine dritte Methode? Ich kann mit Remotedesktop auf alle Server zugreifen, aber ich sehe ungefähr 30 Computer und möchte manuelle Schritte nach Möglichkeit vermeiden. Dies muss nur für SQL Server 2008 und höher funktionieren, und während es nett wäre, über die anderen SQL Server-Dienste (SSIS / SSAS / SSRS) Bescheid zu wissen, ist mein Hauptaugenmerk auf SQL Server selbst gerichtet.
quelle
Antworten:
Wenn Sie etwas wollen, das für die Zukunft nützlich sein wird, würde ich wahrscheinlich vermeiden, die Registrierung zu durchsuchen. Die Strukturen für SQL Server haben sich im Laufe der Jahre etwas geändert und es kann schwierig sein, mitzuhalten.
Die Methode mit dem
SqlDataSourceEnumerator
ist manchmal flockig und obwohl ich sie verwenden werde, kein konkreter Beweis dafür, dass Instanzen im Netzwerk sind. Ich glaube, es hängt auch vom SQL Browser-Dienst ab, den ich die meiste Zeit für deaktiviert halte.Ich werde die WMI-Klasse verwenden
win32_Service
. Ich benutze dies, weil es mehr Informationen über den Dienst bietet alsGet-Service
Cmdlet.Ich schreibe im Allgemeinen alles als Funktionen, weil Sie dies verwenden können, um tatsächlich nur eine tägliche Überprüfung oder Verifizierung des Dienstes zur Fehlerbehebung durchzuführen.
Dies ist etwas mehr als das, was ich normalerweise benutze, aber für den Fall, dass jemand anderes darauf stößt und es verwenden möchte. Das
Test-Connection
entsprichtping myserver
in einer DOS-Eingabeaufforderung und das-Quiet
Flag hat es einfach zurücktrue
oderfalse
. Dies wird standardmäßig auf 4 Pings eingestellt, so-Count 2
dass es bei der Einstellung stattdessen nur zweimal ausgeführt wird.Die Variable
[string[]]$server
ist eine Methode, mit der angegeben$server
wird, dass ein Array von Servernamen akzeptiert wird. Ein Beispielaufruf dieser Funktion könnte also so aussehen:oder
BEARBEITEN
Ein Hinweis ist, dass der obige Hinweis von einer Liste der bereitgestellten Server abhängt. In Fällen, in denen mir diese Liste nicht zur Verfügung gestellt wird, haben Sie einige andere Möglichkeiten.
Wenn ich mich in einer Active Directory-Umgebung befinde, kann ich mithilfe des ActiveDirectory- Moduls in PowerShell eine Liste aller Server in der Domäne mit dem
Get-ADComputer
Cmdlet abrufen. Ein Wort der Warnung, stellen Sie jedoch sicher, dass Sie eine gute-Filter
auf großen Domänen verwenden.Ich habe auch einfach einen IP-Scan (mit Genehmigung) eines Netzwerks durchgeführt, der mir die IP-Adressen angibt, bei denen Port 1433 als offen befunden wurde. Ich werde diese IP-Liste verwenden
Get-ADComputer
, um die Domänencomputernamen zu finden, und diese dann an die obige Funktion übergebenBeispiel:
BEARBEITEN
Die vorgeschlagene Bearbeitung, um den
Write-Verbose
Try / Catch-Block zu verwenden und auch hinzuzufügen, während dies nützlich sein kann und in den meisten Fällen eine Code-Übung ist, überlasse ich es der Person, die diese Funktion verwenden möchte, um diesen zusätzlichen Code oder diese zusätzliche Funktionalität hinzuzufügen. Ich versuche nur, ein einfaches Beispiel zu liefern, um fortzufahren. Ich habe dieSystemName
Eigenschaft zur Ausgabe hinzugefügt , um den tatsächlichen Servernamen, der Informationen zurückgibt, einzuschließen. Tun Sie dies für andere Funktionen und verwenden Sie dies im Allgemeinen nicht für mehr als einen Server gleichzeitig.quelle
Die einzige Möglichkeit, Instanzen in einer Umgebung zu erkennen, ohne alle möglichen Server mit ihren jeweiligen Namen zu kennen, besteht darin, System.Data.Sql.SqlDataSourceEnumerator.GetDataSources () aufzurufen . Diese Methode wird jedoch mit vielen Fußnoten geliefert. Hier ist ein Snippet, das direkt von dieser MSDN-Ressource abgerufen wird:
Der Aufruf von PowerShell ist einfach:
Diese Methode gibt ein
DataTable
Objekt zurück, das Sie entsprechend behandeln können.quelle
Wenn der SQL-Browserdienst aktiv ist, können Sie den Dienst mit dem folgenden PowerShell-Code nach SQL-Instanzen abfragen. Es implementiert die folgenden Kommandos, um die Abfragen auszuführen:
Get-SqlBrowserInstanceDac
quelle
Eine andere Möglichkeit, mögliche SQL-Instanzen zu identifizieren, besteht darin, die in Active Directory aufgelisteten Dienstprinzipalnamen (Service Principle Names, SPNs) zu überprüfen. Wenn Sie mit Windows-Authentifizierung eine Remoteverbindung zu SQL Server herstellen, wird bei der Authentifizierung ein SPN verwendet. Das Vorhandensein eines SPN bedeutet nicht, dass der Server / die Instanz definitiv vorhanden ist und ausgeführt wird, aber es gibt Ihnen eine Liste möglicher Instanzen, die ich im Vergleich zu einigen anderen Ansätzen für umfassender befunden habe.
Um das Leben zu vereinfachen, verwende ich das Cmdlet Get-SPN von: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a
Laden Sie das Skript Get-SPN.ps1 herunter, speichern Sie es in C: \ powershell_scripts \ Get-SPN.ps1 und führen Sie in PowerShell Folgendes aus:
(Natürlich können Sie das Skript auch an einem anderen Ort speichern. Aktualisieren Sie einfach die erste Zeile nach Bedarf.)
Dadurch werden alle SQL Server-SPNs in der aktuellen Domäne aufgelistet, einschließlich der "Spezifikation", die sich auf den Port / die Instanz des Dienstes bezieht.
quelle
Get-Service -ComputerName * MSSQL * | Where-Object {$ _. Status -eq "Running"}
Das sollte benannt werden und Standardinstanzen. Wiederholen Sie einfach Ihre Maschinenliste usw.
quelle
Ich habe es gerade versucht: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()
Es wurden nicht viele Daten zurückgegeben, aber es wurden alle SQL-Server erkannt, die ich in einer VM-Umgebung ausgeführt habe.
quelle