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 SqlDataSourceEnumeratorist 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.
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
}
}
}
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-Connectionentspricht ping myserverin einer DOS-Eingabeaufforderung und das -QuietFlag hat es einfach zurück trueoder false. Dies wird standardmäßig auf 4 Pings eingestellt, so -Count 2dass es bei der Einstellung stattdessen nur zweimal ausgeführt wird.
Die Variable [string[]]$serverist eine Methode, mit der angegeben $serverwird, dass ein Array von Servernamen akzeptiert wird. Ein Beispielaufruf dieser Funktion könnte also so aussehen:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
oder
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
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-ADComputerCmdlet abrufen. Ein Wort der Warnung, stellen Sie jedoch sicher, dass Sie eine gute -Filterauf 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 übergeben
Beispiel:
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
BEARBEITEN
Die vorgeschlagene Bearbeitung, um den Write-VerboseTry / 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 die SystemNameEigenschaft 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.