Fui encarregado de descobrir todas as instâncias do SQL Server em execução em nosso domínio. Em vários casos, existem várias instâncias por servidor. Eu já vi dois métodos diferentes do PowerShell para localizar essas instâncias, mas nenhum deles parece encontrar todas as instâncias.
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 o registro remoto (como no Get-SQLInstance 1 )
O maior problema que encontro é que nem todos os servidores que eu conheço estão em execução com o provedor WMI do SQL Server nem permitem o registro remoto. Existe um terceiro método? Posso usar a Área de trabalho remota para acessar todos os servidores, mas estou vendo aproximadamente 30 máquinas e, se possível, evito etapas manuais. Isso só precisa funcionar para o SQL Server 2008 e superior. Embora seja interessante saber sobre os outros serviços do SQL Server (SSIS / SSAS / SSRS), meu foco principal é o próprio SQL Server.
fonte
Respostas:
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 oGet-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.
Isso é um pouco mais do que eu costumo usar, mas no caso de alguém aparecer e querer usá-lo. Os
Test-Connection
equivale aping myserver
em um prompt do DOS e da-Quiet
bandeira simplesmente tem que voltartrue
oufalse
. 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:ou
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 acimaExemplo:
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 aSystemName
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.fonte
A única maneira que conheço de descobrir instâncias em um ambiente sem conhecer todos os possíveis servidores proprietários e seus nomes específicos, seria fazer uma chamada para System.Data.Sql.SqlDataSourceEnumerator.GetDataSources (). Esse método é fornecido com muitas notas de rodapé. Aqui está um trecho extraído diretamente desse recurso do MSDN:
A chamada é simples no PowerShell:
Esse método retorna um
DataTable
objeto que você pode manipular adequadamente.fonte
Se o Serviço Navegador SQL estiver ativo, você poderá consultar Instâncias SQL com o código do PowerShell abaixo. Ele implementa os seguintes comandos para executar as consultas:
Get-SqlBrowserInstanceDac
fonte
Outra maneira de identificar possíveis instâncias SQL é examinar os SPNs (nomes de princípios de serviço) listados no Active Directory. Quando você se conecta remotamente ao SQL Server com a Autenticação do Windows, um SPN é usado no processo de autenticação. A presença de um SPN não significa que o servidor / instância esteja definitivamente em execução, mas fornece uma lista de possíveis instâncias que eu achei mais abrangentes em algumas das outras abordagens.
Para facilitar a vida, uso o cmdlet Get-SPN em: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a
Baixe o script Get-SPN.ps1, salve-o em C: \ powershell_scripts \ Get-SPN.ps1 e execute o seguinte no PowerShell:
(Obviamente, você pode salvar o script em outro local, basta atualizar a primeira linha conforme necessário.)
Isso listará todos os SPNs do SQL Server no domínio atual, incluindo a "especificação" relacionada à porta / instância do serviço.
fonte
Get-Service -ComputerName * MSSQL * | Onde-objeto {$ _. Status -eq "Em execução"}
Isso deve receber instâncias nomeadas e padrão. Apenas itere sua lista de máquinas, etc.
fonte
Apenas tentei isso: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()
Não foram retornados muitos dados, mas ele detectou todos os servidores sql que eu tenho em execução em um ambiente de VM.
fonte