Solutions de contournement pour les scénarios de Invoke-Command dans les connexions d’API REST

Dans plusieurs connexions à Exchange Online ou à la sécurité & à la conformité PowerShell dans la même fenêtre, vous utilisez l’applet de commande Invoke-Command pour exécuter des scripts ou des commandes dans une session PowerShell distante spécifique. Toutefois, l’applet de commande Invoke-Command ne fonctionne pas dans les connexions de l’API REST à Exchange Online ou à la & de sécurité PowerShell.

Cet article propose des alternatives d’API REST pour les scénarios qui utilisent des commandes Invoke-Command .

Scénario 1 : exécuter des applets de commande Exchange Online

Cet exemple recherche l’identité de tout autre utilisateur ($Us = $User.Identity).

Conseil

D’autres commandes étaient nécessaires pour obtenir les valeurs de $User et donc $Us. Ces commandes ne sont pas importantes. L’approche globale utilisée est ce qui est important.

  • Dans une session PowerShell distante : utilisez l’applet de commande Get-PSSession pour stocker les détails de la session PowerShell distante dans la variable nommée $Session, puis exécutez la commande suivante :

    Invoke-Command -Session $Session -ScriptBlock {Get-User $Using:Us | Select-Object DistinguishedName, ExternalDirectoryObjectId} -ErrorAction SilentlyContinue
    
  • Dans une session d’API REST : Exécutez la commande suivante :

    Get-User $Us | Format-List DistinguishedName, ExternalDirectoryObjectId
    

Cet exemple recherche l’identité d’un membre du groupe :

  • Dans une session PowerShell distante : utilisez l’applet de commande Get-PSSession pour stocker les détails de la session PowerShell distante dans la variable nommée $Session, puis exécutez la commande suivante :

    Invoke-Command -Session $Session -ScriptBlock {Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Select-Object DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails} -ErrorAction SilentlyContinue -HideComputerName
    
  • Dans une session d’API REST : Exécutez la commande suivante :

    Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Format-List DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails
    

Scénario 2 : Exécuter des applets de commande Exchange Online et développer des propriétés spécifiques

Cet exemple recherche toutes les boîtes aux lettres où l’autorisation GrantSendOnBehalfTo est définie, puis renvoie les utilisateurs qui ont l’autorisation sur la boîte aux lettres.

  • Dans une session PowerShell distante : utilisez l’applet de commande Get-PSSession pour stocker les détails de la session PowerShell distante dans la variable nommée $Session, puis exécutez la commande suivante :

    Invoke-Command -Session $Session -ScriptBlock {Get-Mailbox -Filter "GrantSendOnBehalfTo -ne `$null" -ErrorAction SilentlyContinue | Select-Object ExternalDirectoryObjectId, GrantSendOnBehalfTo -ExpandProperty GrantSendOnBehalfTo}
    
  • Dans une session d’API REST : Exécutez la commande suivante :

    $mailboxes = Get-Mailbox -Filter "GrantSendOnBehalfTo -ne `$null"
    
    foreach ($mailbox in $mailboxes)
    
    {
      $users = $mailbox | Select-Object GrantSendOnBehalfTo -ExpandProperty GrantSendOnBehalfTo | Get-User
    
      $users | Select-Object Name, Guid
    }
    

Scénario 3 : exécuter des applets de commande Exchange Online dans une session PowerShell spécifique lorsque plusieurs sessions sont présentes

Cet exemple montre comment créer deux sessions PowerShell dans la même fenêtre et exécuter l’applet de commande Get-Mailbox dans chaque session.

  • Dans une session PowerShell distante :

    1. Utilisez l’applet de commande Get-PSSession pour stocker les détails de la première session PowerShell distante dans la variable nommée $Session1.

    2. Utilisez l’applet de commande Get-PSSession pour stocker les détails de la deuxième session distante PowerShell dans la variable nommée $Session2.

    3. Exécutez les commandes suivantes :

      Invoke-Command -Session $Session1 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
      Invoke-Command -Session $Session2 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
  • Dans une session d’API REST :

    1. Dans la première commande Connect-ExchangeOnline , utilisez le paramètre Prefix avec la valeur C1.

    2. Stockez les premiers détails de connexion à l’API REST dans la variable nommée $ConnectionInfo1 en exécutant la commande suivante :

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C1"}
      
    3. Dans la deuxième commande Connect-ExchangeOnline , utilisez le paramètre Prefix avec la valeur C2.

    4. Stockez les détails de la deuxième connexion à l’API REST dans la variable nommée $ConnectionInfo2 en exécutant la commande suivante :

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C2"}
      
    5. Vous pouvez désormais exécuter des commandes dans l’une ou l’autre session. Par exemple :

      $CommandStr1 = "Get-$($ConnectionInfo1.ModulePrefix)Mailbox -ResultSize 10"
      
      Invoke-Expression $CommandStr1
      

      Ou

      $CommandStr2 = "Get-$($ConnectionInfo2.ModulePrefix)Mailbox -ResultSize 10"
      
      Invoke-Expression $CommandStr2