Si desea algo que sea útil para el futuro, probablemente evite intentar buscar en el registro. Las colmenas para SQL Server han cambiado un poco a lo largo de los años y puede ser problemático mantenerse al día.
El método con el SqlDataSourceEnumeratores escamoso a veces y aunque lo usaré, no hay evidencia concreta de que haya instancias en la red. Creo que también depende del servicio del navegador SQL, que la mayoría de las veces encuentro deshabilitado.
Utilizaré la clase WMI win32_Service. Lo uso porque ofrece más información sobre el servicio que el Get-Servicecmdlet.
Escribo todo como funciones en general porque puedes usar esto para hacer una verificación diaria o verificación del servicio para la resolución de 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
}
}
}
Esto es un poco más de lo que suelo usar, pero en caso de que alguien más se encuentre y quiera usarlo. Esto Test-Connectionequivale a ping myserverun indicador de DOS y la -Quietbandera simplemente lo devuelve trueo false. Esto establecerá de forma predeterminada 4 pings, por lo que la configuración -Count 2solo hace que lo haga dos veces.
La variable [string[]]$serveres un método utilizado para indicar que $serveraceptará una matriz de nombres de servidor. Entonces, una llamada de ejemplo de esta función podría verse así:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
o
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
EDITAR
Un comentario destacado es que lo anterior depende de una lista de servidores que se proporciona. En los casos en que no se me proporcione esa lista, tiene algunas otras opciones.
Si estoy en un entorno de Active Directory, puedo usar el módulo ActiveDirectory en PowerShell para obtener una lista de todos los servidores en el dominio con Get-ADComputercmdlet. Sin embargo, una advertencia: asegúrese de usar un bien -Filteren dominios grandes.
También simplemente hice un escaneo IP (con aprobación) de una red que me da las direcciones IP donde se encontró el puerto 1433 abierto. Tomaré esa lista de IP y la utilizaré Get-ADComputerpara encontrar los nombres de computadora de dominio, luego la pasaré a la función anterior
Ejemplo:
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
La edición sugerida para utilizar Write-Verbosey también agregar en el bloque try / catch, aunque eso puede ser útil, y en la mayoría de los casos una práctica de código, lo dejaré en manos de la persona que quiera usar esta función para agregar ese código o funcionalidad adicional. Solo trato de proporcionar un ejemplo básico para continuar. Agregué la SystemNamepropiedad a la salida para incluir la información de retorno del nombre real del servidor, hacer esto en otras funciones, generalmente no lo uso para más de un servidor a la vez, así que se me olvidó.