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 SqlDataSourceEnumerator
es 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-Service
cmdlet.
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-Connection
equivale a ping myserver
un indicador de DOS y la -Quiet
bandera simplemente lo devuelve true
o false
. Esto establecerá de forma predeterminada 4 pings, por lo que la configuración -Count 2
solo hace que lo haga dos veces.
La variable [string[]]$server
es un método utilizado para indicar que $server
aceptará 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-ADComputer
cmdlet. Sin embargo, una advertencia: asegúrese de usar un bien -Filter
en 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-ADComputer
para 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-Verbose
y 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 SystemName
propiedad 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ó.