Se si desidera qualcosa che sarà utile per il futuro, probabilmente mi starei alla larga dal tentativo di cercare nel registro. Gli alveari per SQL Server sono cambiati un po 'nel corso degli anni e può essere problematico tenere il passo.
Il metodo con the SqlDataSourceEnumeratora volte è traballante e anche se lo userò, non prove concrete che le istanze siano sulla rete. Credo che dipenda anche dal servizio SQL Browser, che la maggior parte delle volte trovo disabilitato.
Userò la classe WMI win32_Service. Lo uso perché offre più informazioni sul servizio rispetto al Get-Servicecmdlet.
Scrivo tutto come funzioni in generale perché puoi usarlo per fare semplicemente il controllo o la verifica giornaliera del servizio per la risoluzione dei problemi.
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
}
}
}
Questo è un po 'più di quello che di solito uso, ma nel caso in cui qualcuno si imbatte e vuole usarlo. Le Test-Connectionè assimilato a ping myserverun prompt di DOS e la -Quietbandiera semplicemente deve solo si restituiscono trueo false. L'impostazione predefinita è 4 ping, quindi l'impostazione -Count 2consente di farlo invece due volte.
La variabile [string[]]$serverè un metodo utilizzato per affermare che $serveraccetterà una matrice di nomi di server. Quindi un esempio di chiamata di questa funzione potrebbe assomigliare a:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
o
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
MODIFICARE
Un commento noto è che quanto sopra dipende da un elenco di server forniti. Nei casi in cui non mi viene fornito tale elenco, hai alcune altre opzioni.
Se mi trovo in un ambiente Active Directory, posso usare il modulo ActiveDirectory in PowerShell per estrarre un elenco di tutti i server sul dominio con il Get-ADComputercmdlet. Un avvertimento, tuttavia, assicurati di utilizzare un buon -Filtersu grandi domini.
Ho anche semplicemente fatto una scansione IP (con approvazione) di una rete che mi dà gli indirizzi IP in cui la porta 1433 è stata trovata aperta. Prenderò quell'elenco IP e lo userò Get-ADComputerper trovare i nomi dei computer di dominio, quindi lo passerò nella funzione sopra
Esempio:
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
MODIFICARE
La modifica suggerita da utilizzare Write-Verbosee anche aggiungere nel blocco try / catch, mentre ciò può essere utile, e nella maggior parte dei casi una pratica del codice, la lascerò alla persona che desidera utilizzare questa funzione per aggiungere quel codice o funzionalità aggiuntiva. Sto solo cercando di fornire un esempio di base per continuare. Ho aggiunto la SystemNameproprietà all'output per includere il nome del server effettivo che restituisce informazioni, farlo su altre funzioni in genere non lo uso per più di un server alla volta, quindi mi è passato di mente.