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 SqlDataSourceEnumerator
a 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-Service
cmdlet.
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 myserver
un prompt di DOS e la -Quiet
bandiera semplicemente deve solo si restituiscono true
o false
. L'impostazione predefinita è 4 ping, quindi l'impostazione -Count 2
consente di farlo invece due volte.
La variabile [string[]]$server
è un metodo utilizzato per affermare che $server
accetterà 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-ADComputer
cmdlet. Un avvertimento, tuttavia, assicurati di utilizzare un buon -Filter
su 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-ADComputer
per 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-Verbose
e 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 SystemName
proprietà 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.