J'ai été chargé de découvrir toutes les instances de SQL Server qui s'exécutent dans notre domaine. Dans plusieurs cas, il existe plusieurs instances par serveur. J'ai vu deux méthodes PowerShell différentes pour trouver ces instances, mais aucune ne semble trouver toutes les instances.
1) Utilisez 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) Utilisez un registre distant (comme avec Get-SQLInstance 1 )
Le plus gros problème que je rencontre est que tous les serveurs que je connais ne fonctionnent pas avec le fournisseur SQL Server WMI et n'autorisent pas tous le registre distant. Existe-t-il une troisième méthode? Je peux utiliser Remote Desktop pour accéder à tous les serveurs mais je regarde environ 30 machines et j'aimerais éviter les étapes manuelles si possible. Cela ne doit fonctionner que pour SQL Server 2008 et versions ultérieures et même s'il serait bien de connaître les autres services SQL Server (SSIS / SSAS / SSRS), mon objectif principal est SQL Server lui-même.
la source
Réponses:
Si vous voulez quelque chose qui sera utile pour l'avenir, je me garderais probablement d'essayer de rechercher dans le registre. Les ruches pour SQL Server ont un peu changé au fil des ans et il peut être difficile de suivre.
La méthode avec le
SqlDataSourceEnumerator
est parfois instable et bien que je l'utilise, ce n'est pas une preuve concrète que des instances sont sur le réseau. Je crois que cela dépend également du service de navigateur SQL, que je trouve la plupart du temps désactivé.J'utiliserai la classe WMI
win32_Service
. J'utilise cela car il offre plus d'informations sur le service que laGet-Service
cmdlet.J'écris tout en tant que fonctions en général parce que vous pouvez l'utiliser pour faire juste une vérification ou une vérification quotidienne du service pour le dépannage.
C'est un peu plus que ce que j'utilise habituellement, mais au cas où quelqu'un d'autre viendrait et voudrait l'utiliser. Le
Test-Connection
équivaut àping myserver
dans une invite DOS et le-Quiet
drapeau l'a simplement renvoyétrue
oufalse
. Ce sera par défaut à 4 pings donc le réglage le-Count 2
fait simplement le faire deux fois à la place.La variable
[string[]]$server
est une méthode utilisée pour déclarer qui$server
acceptera un tableau de noms de serveur. Ainsi, un exemple d'appel de cette fonction pourrait ressembler à ceci:ou
ÉDITER
Un commentaire noté est que ce qui précède dépend d'une liste de serveurs fournie. Dans les cas où je ne reçois pas cette liste, vous avez quelques autres options.
Si je suis dans un environnement Active Directory, je peux utiliser le module ActiveDirectory dans PowerShell pour extraire une liste de tous les serveurs du domaine avec
Get-ADComputer
cmdlet. Un mot d'avertissement cependant assurez-vous d'utiliser un bien-Filter
sur de grands domaines.J'ai également simplement fait une analyse IP (avec approbation) d'un réseau qui me donne les adresses IP où le port 1433 a été trouvé ouvert. Je vais prendre cette liste IP et l'utiliser
Get-ADComputer
pour trouver les noms des ordinateurs du domaine, puis les transmettre à la fonction ci-dessusExemple:
ÉDITER
La modification suggérée à utiliser
Write-Verbose
et à ajouter également un bloc try / catch, bien que cela puisse être utile, et dans la plupart des cas une pratique de code, je laisserai cela à la personne qui veut utiliser cette fonction pour ajouter ce code ou cette fonctionnalité supplémentaire. J'essaie juste de fournir un exemple de base pour continuer. J'ai ajouté laSystemName
propriété à la sortie pour inclure le nom du serveur réel renvoyant des informations, faites-le sur d'autres fonctions, ne l'utilisez généralement pas pour plus d'un serveur à la fois, donc cela m'a glissé.la source
La seule façon que je connaisse de découvrir des instances dans un environnement sans connaître tous les serveurs propriétaires possibles et leurs noms particuliers serait d'appeler System.Data.Sql.SqlDataSourceEnumerator.GetDataSources (). Cette méthode est cependant accompagnée de nombreuses notes de bas de page. Voici un extrait extrait directement de cette ressource MSDN:
L'appel est simple depuis PowerShell:
Cette méthode renvoie un
DataTable
objet que vous pouvez gérer en conséquence.la source
Si le service de navigateur SQL est actif, vous pouvez interroger le service pour les instances SQL avec le code PowerShell ci-dessous. Il implémente les commandlets suivants pour effectuer les requêtes:
Get-SqlBrowserInstanceDac
la source
Une autre façon d'identifier les instances SQL possibles consiste à examiner les noms de principe de service (SPN) répertoriés dans Active Directory. Lorsque vous vous connectez à SQL Server à distance avec l'authentification Windows, un SPN est utilisé dans le processus d'authentification. La présence d'un SPN ne signifie pas que le serveur / l'instance est définitivement là et fonctionne mais cela vous donne une liste d'instances possibles que j'ai trouvées plus complètes que certaines des autres approches.
Pour vous faciliter la vie, j'utilise l'applet de commande Get-SPN à partir de: https://gallery.technet.microsoft.com/scriptcenter/Get-SPN-Get-Service-3bd5524a
Téléchargez le script Get-SPN.ps1, enregistrez-le dans C: \ powershell_scripts \ Get-SPN.ps1 et exécutez ce qui suit dans PowerShell:
(Évidemment, vous pouvez enregistrer le script dans un autre emplacement, mettez à jour la première ligne au besoin.)
Cela répertoriera tous les SPN SQL Server sur le domaine actuel, y compris la "spécification" relative au port / à l'instance du service.
la source
Get-Service -ComputerName * MSSQL * | Where-Object {$ _. Status -eq "Running"}
Cela devrait obtenir des instances nommées et par défaut. Parcourez simplement votre liste de machines, etc.
la source
Je viens d'essayer ceci: [System.Data.Sql.SqlDataSourceEnumerator] :: Instance.GetDataSources ()
Pas beaucoup de données retournées, mais il a détecté tous les serveurs SQL que j'exécute dans un environnement de machine virtuelle.
la source