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.
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-Connection
entspricht ping myserver
in einer DOS-Eingabeaufforderung und das -Quiet
Flag hat es einfach zurück true
oder false
. 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:
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-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 ü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-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 die SystemName
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.