janvier
2012
Mikedavem propose une solution pour exporter la liste des serveurs et groupes contenus dans un CMS.
Trouvant la méthode assez compliquée par rapport à ce qu’il est réalisable au niveau du GUI, je me suis posé la question « Comment automatiser ce que le GUI fait ? ».
Premier reflexe: SQL Profiler… Caramba! On ne voit rien passer.
Second reflexe (toujours moins naturel celui-la): Powershell !
Pre-requis:
La session powershell doit être ouverte sur le serveur ou le CMS tourne – ou en utilisant du remote powershell (pas teste).
Le snappin/module (2008/2012) sqlps doit être chargé.
En regardant un peu la documentation, on peut remarquer que sqlps, au travers du provider SqlServer, permet de naviguer au travers des serveurs enregistrés.
#Liste des providers
Get-PSProvider
#Liste des "folders" du provider SQLSERVER
set-location SQLSERVER:
ls
Pour naviguer on fera comme pour naviguer dans une arborescence de file system:
cd .\SQLRegistration #Serveurs enregistrés
cd '.\Central Management Server Group' #CMS (cd pouvez taper cd <tab> et powershell completera la ligne pour vous)
cd .\%2E%5CSQL11 #le nom de mon CMS qui est literalement .\SQL11 - Vive le trick ci-dessus (cd <tab>) pour retrouver le bon nom ;)
ls #presente la liste de serveurs/groupes presents à la racine du CMS
Maintenant regardons les méthodes existantes pour l’objet dans lequel nous nous trouvons ainsi que de quelle classe est cet objet (si vous débutez avec le powershell et que ceci vous semble bizarre… C’est normal … Ou pas… En tout cas c’est l’effet que ca m’a fait ^^):
Get-Item . | Get-Member
On peut voir que le nom de la classe (TypeName) de l’objet est Microsoft.SqlServer.Management.RegisteredServers.ServerGroup et une méthode appelée export!
C’est cette methode qui va nous servir à réaliser l’export.
Voici le script permettant de réaliser cet export (n’oubliez pas les pré-requis! et pensez à changer les valeurs des variables ;)):
$CMSPath = 'SQLSERVER:\SQLRegistration\Central Management Server Group\%2E%5CSQL11' #Location of the Central Management server to be exported
$exportFile = 'C:\Powershell\CMS\cms.xml' #Path of the export file
set-location $CMSPath
(get-item .).export($exportFile, 'None')
Maintenant, pour l’import, même principe en utilisant cette fois ci la méthode… import … Je suis sur que vous l’aviez déjà deviné ;):
$CMSPath = 'SQLSERVER:\SQLRegistration\Central Management Server Group\%2E%5CSQL11' #Location of the Central Management server where to import
$importFile = 'C:\Powershell\CMS\cms.xml' #Path of the file to import
set-location $CMSPath
(get-item .).import($importFile)
Voila !