APSQL

Utiliser le mode de sécurité SQL depuis PowerShell

Lors de l'écriture de scripts PowerShell, l'authentification auprès du serveur en utilisant le mode de sécurité Windows est automatique. Il n'est donc pas nécessaire de définir une opération particulière pour se connecter ainsi.

Cependant SQL Server propose 2 modes de sécurités pour les connexions : le mode Windows et le mode SQL Server. Dans ce second mode le nom de la connexion et le mot de passe sont gérés par SQL Server. Il faut donc fournir ces 2 informations pour tenter d'établir la connexion avec le serveur.

Cette façon de procéder est illustré ci dessous en passant les objets SMO, qui sont chargés de la faço, suivante

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')|out-null
			

Le serveur SQL (local dans le cas présent) est identifié et représenté par un objet nommé $serveur. Et il est précisé que l'on souhaite se connecter à ce serveur en utilisant le mode de sécurité SQL serveur en affectant la valeur false à la propriété LoginSecure.

$serveur=new-object('Microsoft.SqlServer.Management.Smo.server') "LOCALHOST"
$serveur.ConnectionContext.LoginSecure=$false;
			

Les informations de nom et de mot de passe sont spécifiés avec les méthodes set_Login et set_Password.

$serveur.ConnectionContext.set_login("admin");
$serveur.ConnectionContext.set_Password("p@ssW0rd");
			

Le script final et complet est donc présenté ci dessous. La dernière instruction permet d'afficher la liste des bases disponibles sur le serveur ceci afin d'illustrer que la connexion est bien établie.

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')|out-null
$serveur=new-object('Microsoft.SqlServer.Management.Smo.server') "LOCALHOST"
$serveur.ConnectionContext.LoginSecure=$false;
$serveur.ConnectionContext.set_login("admin");
$serveur.ConnectionContext.set_Password("p@ssW0rd");
$srv.Databases | Select name
			

Ce script est agréable mais pour de nombreuses raisons, il n'est pas envisageable d'imaginer laisser ainsi en clair dans un script une authentification SQL car c'est une faille de sécurité difficilement acceptable. Bien qu'il soit possible de crypter le mote de passe, la solution retenue consiste à demander de façon interactive les informations de connexions lors de l'exécution du script. Cette demande va être faite grace à la comamndlet Get-Credential qui présente la boite de dialogue d'authentification Windows et permet de saisir un nom et un mot de passe. Les informations saisies sont disponibles dans l'oblet retourné dans par cette commandlet. Le mot de passe n'est bien sur pas stocké en clair et c'est pourquoi il est transmis à SQl server par la méthode set_SecurePassword. Comme il s'agit d'une authentificaiton Windows, le nom d'utilisateurt est préfixé par le caactère \. La méthode replace permet de supprimer ce caratère aavnt de soumettre le nm d'utilisateur à SQL Server. Le script final est donc:

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')|out-null
$credential=Get-Credential
$loginName=$credential.UserName-replace("\\","")
$srv=new-object('Microsoft.SqlServer.Management.Smo.server') "LOCALHOST"
$srv.ConnectionContext.LoginSecure=$false;
$srv.ConnectionContext.set_login($loginName);
$srv.ConnectionContext.set_SecurePassword($credential.Password);
$srv.ConnectionContext.ApplicationName="MySQLAuthentificationPowerShell"
$srv.Databases | Select name