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

Dans plusieurs connexions à Exchange Online ou Security & Compliance 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 d’API REST à Exchange Online ou à PowerShell de conformité & de sécurité.

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 par conséquent $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 de 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 pour lesquelles l’autorisation GrantSendOnBehalfTo est définie, puis retourne les utilisateurs qui disposent de 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 Exchange Online applets de commande 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 PowerShell distante 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 de 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 de 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 maintenant 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