Si vous voulez quelque chose qui sera utile pour l'avenir, je me garderais probablement d'essayer de rechercher dans le registre. Les ruches pour SQL Server ont un peu changé au fil des ans et il peut être difficile de suivre.
La méthode avec le SqlDataSourceEnumeratorest parfois instable et bien que je l'utilise, ce n'est pas une preuve concrète que des instances sont sur le réseau. Je crois que cela dépend également du service de navigateur SQL, que je trouve la plupart du temps désactivé.
J'utiliserai la classe WMI win32_Service. J'utilise cela car il offre plus d'informations sur le service que la Get-Servicecmdlet.
J'écris tout en tant que fonctions en général parce que vous pouvez l'utiliser pour faire juste une vérification ou une vérification quotidienne du service pour le dépannage.
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
}
}
}
C'est un peu plus que ce que j'utilise habituellement, mais au cas où quelqu'un d'autre viendrait et voudrait l'utiliser. Le Test-Connectionéquivaut à ping myserverdans une invite DOS et le -Quietdrapeau l'a simplement renvoyé trueou false. Ce sera par défaut à 4 pings donc le réglage le -Count 2fait simplement le faire deux fois à la place.
La variable [string[]]$serverest une méthode utilisée pour déclarer qui $serveracceptera un tableau de noms de serveur. Ainsi, un exemple d'appel de cette fonction pourrait ressembler à ceci:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
ou
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
ÉDITER
Un commentaire noté est que ce qui précède dépend d'une liste de serveurs fournie. Dans les cas où je ne reçois pas cette liste, vous avez quelques autres options.
Si je suis dans un environnement Active Directory, je peux utiliser le module ActiveDirectory dans PowerShell pour extraire une liste de tous les serveurs du domaine avec Get-ADComputercmdlet. Un mot d'avertissement cependant assurez-vous d'utiliser un bien -Filtersur de grands domaines.
J'ai également simplement fait une analyse IP (avec approbation) d'un réseau qui me donne les adresses IP où le port 1433 a été trouvé ouvert. Je vais prendre cette liste IP et l'utiliser Get-ADComputerpour trouver les noms des ordinateurs du domaine, puis les transmettre à la fonction ci-dessus
Exemple:
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
ÉDITER
La modification suggérée à utiliser Write-Verboseet à ajouter également un bloc try / catch, bien que cela puisse être utile, et dans la plupart des cas une pratique de code, je laisserai cela à la personne qui veut utiliser cette fonction pour ajouter ce code ou cette fonctionnalité supplémentaire. J'essaie juste de fournir un exemple de base pour continuer. J'ai ajouté la SystemNamepropriété à la sortie pour inclure le nom du serveur réel renvoyant des informations, faites-le sur d'autres fonctions, ne l'utilisez généralement pas pour plus d'un serveur à la fois, donc cela m'a glissé.