Exchange PowerShell et CmdLet distante

Passons en revue les différentes méthodes pour passer des commandes PowerShell à un serveur distant...

 

Méthode 1 : Sans l'environnement Exchange

Pour envoyer rapidement une commande sur un serveur distant, la méthode "Invoke-Command" est simple et rapide à utiliser :

1. Construire la commande dans un environnement PowerShell, elle sera directement exécutée sur le serveur distant spécifié sous l'identité de l'utilisateur qui l'a lancée :

Invoke-Command -ComputerName DISTANT_SERVER

-ScriptBlock {COMMAND_TO_EXECUTE_REMOTELY}

2. Pour aller plus loin et envoyer des variables en paramètre de la commande à injecter, utiliser "ArgumentList" :

 Invoke-command -ComputerName DISTANT_SERVER

-ScriptBlock {COMMAND_TO_EXECUTE_REMOTELY  -Param1 $args[0] -Param2 $args[1]}

-ArgumentList $Var1,$Var2

Dans ce cas, une association est créée entre la liste des arguments récupérés dans "ArgumentList" puis transmis dans le "ScriptBlock" selon leur position dans la liste (1,2,3,4, …) :

" $Var1" correspond ici l'argument numéro 0 nommé " $Args[0] "

" $Var2" correspond ici l'argument numéro 1 nommé " $Args[1] "

Méthode 2 : Avec l'environnement Exchange

La méthode suivante est la plus connue :

1. Enregistrer une paire de Login/Password chiffré dans une variable :

$Creds = Get-Credential

2. Inscrire dans une variable les paramètres d'une session PowerShell contenant ntoamment le FQDN du serveur distant et l'identité à utiliser :

$session = New-PSSession -ConfigurationName Microsoft.Exchange

–ConnectionUri https://EXCHANGE_SERVER_FQDN/powershell

-Credential $Creds

3. Enfin, importer la session distante contenue dans la variable précédente :

Import-PSSession $session

4. Vue d'ensemble :

Méthode 3 : Avec l'environnement Exchange

Pour initialiser un environnement Exchange PowerShell distant rapidement, la CmdLet "CreateOrGetExchangeSession" est elle moins connue. A noter toutefois que cette dernière vient avec l'environnement Exchange PowerShell et qui devient donc un prérequis indispensable localement. Vue détaillée...

1. Lancer une console Exchange PowerShell locale :

2. Construire une session distante :

 

$session = CreateOrGetExchangeSession -FQDN EXCHANGE_SERVER_FQDN

3. Construire la commande à envoyer et l'injecter dans la session : 

Invoke-command -ScriptBlock {COMMAND_TO_EXECUTE_REMOTELY} -Session $Session

 Dans ce dernier exemple, il est aussi possible de passer des paramètres de la même manière qu'expliqué dans la méthode 1.

Méthode 3 bis : Pour aller plus loin avec l'environnement Exchange

Sur la même base que la méthode 3, essayons d'aller encore plus loin  ...

1. Lancer une console Exchange PowerShell locale

2. Construire une session distante :

$session = CreateOrGetExchangeSession -FQDN EXCHANGE_SERVER_FQDN

3. Injecter dans la session un script complet : 

     Invoke-command -ScriptBlock {

Param($Param_1,$Param_2,$Param_3)Function Foo ($Param_Func_1,$Param_Func_2) { Write-host "param 1 is {0}" –f $Param_Func_1 }

        Foo –Param_Func_1 $Param_1}

      -ArgumentList $Var_1,$Var_2 

      -Session $Session

Dans cet exemple, 3 variables de l'environnement local sont transmises dans la session distante : " $Var_1", " $Var_2" et " $Var_3".

Une correspondance directe est faite avec les "Param" transmis à l'intérieur du "ScriptBlock" et donc avec : " $Param_1", " $Param_2" et " $Param_3".

Une fonction "Foo" est transmise dans la session distante, cette dernière s'appuie sur des 2 paramètres " $Param_Func_1" et " $Param_Func_2".

Enfin, la fonction "Foo" est appelée à distance et le paramètre " $Param_1" lui est transmis. Ce paramètre provient donc lui même de la session locale transmis via la variable " $Var_1".