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 SqlDataSourceEnumerator
est 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-Service
cmdlet.
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 myserver
dans une invite DOS et le -Quiet
drapeau l'a simplement renvoyé true
ou false
. Ce sera par défaut à 4 pings donc le réglage le -Count 2
fait simplement le faire deux fois à la place.
La variable [string[]]$server
est une méthode utilisée pour déclarer qui $server
acceptera 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-ADComputer
cmdlet. Un mot d'avertissement cependant assurez-vous d'utiliser un bien -Filter
sur 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-ADComputer
pour 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-Verbose
et à 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 SystemName
proprié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é.