Se você quiser algo que será útil para o futuro, provavelmente evitaria tentar pesquisar no registro. As seções do SQL Server mudaram um pouco ao longo dos anos e pode ser problemático acompanhar.
O método com o SqlDataSourceEnumerator
é esquisito às vezes e, embora eu o use, não há evidências concretas de que instâncias estejam na rede. Acredito que depende também do SQL Browser Service, que na maioria das vezes acho desativado.
Vou utilizar a classe WMI win32_Service
. Eu uso isso porque ele oferece mais informações sobre o serviço do que o Get-Service
cmdlet.
Geralmente, escrevo tudo como funções, porque você pode usá-lo para apenas verificar diariamente ou verificar o serviço para solucionar problemas.
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
}
}
}
Isso é um pouco mais do que eu costumo usar, mas no caso de alguém aparecer e querer usá-lo. Os Test-Connection
equivale a ping myserver
em um prompt do DOS e da -Quiet
bandeira simplesmente tem que voltar true
ou false
. O padrão será 4 pings, portanto, a configuração -Count 2
apenas o faz duas vezes.
A variável [string[]]$server
é um método usado para declarar que $server
aceitará uma matriz de nomes de servidores. Portanto, um exemplo de chamada dessa função pode ser algo como:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
ou
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
EDITAR
Um comentário observado é que o acima depende de uma lista de servidores sendo fornecidos. Nos casos em que não recebo essa lista, você tem algumas outras opções.
Se estiver em um ambiente do Active Directory, posso usar o módulo ActiveDirectory no PowerShell para obter uma lista de todos os servidores no domínio com Get-ADComputer
cmdlet. Uma palavra de aviso, porém, certifique-se de usar um bem -Filter
em domínios grandes.
Também fiz simplesmente uma varredura IP (com aprovação) de uma rede que me fornece os endereços IP em que a porta 1433 foi encontrada aberta. Vou pegar essa lista de IP e utilizá-la Get-ADComputer
para encontrar os nomes dos computadores de domínio e depois passá-los para a função acima
Exemplo:
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
EDITAR
A edição sugerida para utilizar Write-Verbose
e também adicionar o bloco try / catch, embora possa ser útil e, na maioria dos casos, uma prática de código, deixarei isso para a pessoa que deseja usar essa função para adicionar esse código ou funcionalidade adicional. Apenas tentando fornecer um exemplo básico para continuar. Eu adicionei a SystemName
propriedade à saída para incluir o nome real do servidor, retornando informações; faça isso em outras funções, geralmente não use isso para mais de um servidor por vez, de modo que isso me escapou da cabeça.