Me encargaron descubrir todas las instancias de SQL Server que se ejecutan dentro de nuestro dominio. En varios casos hay varias instancias por servidor. He visto dos métodos diferentes de PowerShell para encontrar estas instancias, pero ninguno parece encontrar todas las instancias.
1) Use WMI
$srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName
$instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}}
return $instances
2) Use el registro remoto (como con Get-SQLInstance 1 )
El mayor problema con el que me encuentro es que no todos los servidores que conozco se ejecutan con el proveedor WMI de SQL Server ni todos permiten el registro remoto. ¿Hay un tercer método? Puedo usar Escritorio remoto para acceder a todos los servidores, pero estoy mirando aproximadamente 30 máquinas y me gustaría evitar los pasos manuales si es posible. Esto solo tiene que funcionar para SQL Server 2008 y versiones posteriores, y aunque sería bueno saber acerca de los otros servicios de SQL Server (SSIS / SSAS / SSRS), mi enfoque principal está en SQL Server.
fuente
Respuestas:
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 elGet-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.
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 aping myserver
un indicador de DOS y la-Quiet
bandera simplemente lo devuelvetrue
ofalse
. 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í:o
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 anteriorEjemplo:
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é laSystemName
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ó.fuente
La única forma en que sé descubrir instancias en un entorno sin conocer todos los posibles servidores propietarios y sus nombres particulares, sería hacer una llamada a System.Data.Sql.SqlDataSourceEnumerator.GetDataSources (). Sin embargo, este método viene con muchas notas al pie. Aquí hay un fragmento que se extrae directamente de ese recurso de MSDN:
La llamada es simple desde PowerShell:
Ese método devuelve un
DataTable
objeto que puede manejar en consecuencia.fuente
Si el servicio del navegador SQL está activo, puede consultar el servicio para instancias SQL con el código de PowerShell a continuación. Implementa los siguientes comandos para realizar las consultas:
Get-SqlBrowserInstanceDac
fuente
Otra forma de identificar posibles instancias de SQL es mirar los nombres principales de servicio (SPN) enumerados en Active Directory. Cuando se conecta a SQL Server de forma remota con la autenticación de Windows, se utiliza un SPN en el proceso de autenticación. La presencia de un SPN no significa que el servidor / instancia definitivamente esté allí y ejecutándose, pero le brinda una lista de posibles instancias que he encontrado que son más completas que algunos de los otros enfoques.
Para facilitar la vida, uso el cmdlet Get-SPN de: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a
Descargue el script Get-SPN.ps1, guárdelo en C: \ powershell_scripts \ Get-SPN.ps1 y ejecute lo siguiente en PowerShell:
(Obviamente, puede guardar el script en otra ubicación, solo actualice la primera línea según sea necesario).
Esto enumerará todos los SPN de SQL Server en el dominio actual, incluida la "especificación" que se relaciona con el puerto / instancia del servicio.
fuente
Get-Service -ComputerName * MSSQL * | Where-Object {$ _. Status -eq "En ejecución"}
Eso debería tener instancias con nombre y predeterminadas. Simplemente repita su lista de máquinas, etc.
fuente
Acabo de intentar esto: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()
No se devolvieron muchos datos, pero detectó todos los servidores sql que ejecuto en un entorno VM.
fuente