Problemumgehungen für Invoke-Command Szenarien in REST-API-Verbindungen

In mehreren Verbindungen mit Exchange Online oder Security & Compliance PowerShell im selben Fenster verwenden Sie das Cmdlet Invoke-Command, um Skripts oder Befehle in einer bestimmten PowerShell-Remotesitzung auszuführen. Das Cmdlet Invoke-Command funktioniert jedoch nicht in REST-API-Verbindungen mit Exchange Online oder Security & Compliance PowerShell.

Dieser Artikel enthält REST-API-Alternativen für Szenarien, in denen Invoke-Command-Befehle verwendet werden.

Szenario 1: Ausführen Exchange Online Cmdlets

In diesem Beispiel wird die Identität eines anderen Benutzers ($Us = $User.Identity) ermittelt.

Tipp

Andere Befehle waren erforderlich, um die Werte von $User und abzurufen $Us. Diese Befehle sind nicht wichtig. Wichtig ist der allgemeine Ansatz, der verwendet wird.

  • In einer PowerShell-Remotesitzung: Verwenden Sie das Cmdlet Get-PSSession , um die PowerShell-Remotesitzungsdetails in der Variablen namens $Sessionzu speichern, und führen Sie dann den folgenden Befehl aus:

    Invoke-Command -Session $Session -ScriptBlock {Get-User $Using:Us | Select-Object DistinguishedName, ExternalDirectoryObjectId} -ErrorAction SilentlyContinue
    
  • In einer REST-API-Sitzung: Führen Sie den folgenden Befehl aus:

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

In diesem Beispiel wird die Identität eines Gruppenmitglieds gesucht:

  • In einer PowerShell-Remotesitzung: Verwenden Sie das Cmdlet Get-PSSession , um die PowerShell-Remotesitzungsdetails in der Variablen namens $Sessionzu speichern, und führen Sie dann den folgenden Befehl aus:

    Invoke-Command -Session $Session -ScriptBlock {Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Select-Object DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails} -ErrorAction SilentlyContinue -HideComputerName
    
  • In einer REST-API-Sitzung: Führen Sie den folgenden Befehl aus:

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

Szenario 2: Ausführen Exchange Online Cmdlets und Erweitern bestimmter Eigenschaften

In diesem Beispiel werden alle Postfächer gesucht, in denen die Berechtigung GrantSendOnBehalfTo festgelegt ist. Anschließend werden die Benutzer zurückgegeben, die über die Berechtigung für das Postfach verfügen.

  • In einer PowerShell-Remotesitzung: Verwenden Sie das Cmdlet Get-PSSession , um die PowerShell-Remotesitzungsdetails in der Variablen namens $Sessionzu speichern, und führen Sie dann den folgenden Befehl aus:

    Invoke-Command -Session $Session -ScriptBlock {Get-Mailbox -Filter "GrantSendOnBehalfTo -ne `$null" -ErrorAction SilentlyContinue | Select-Object ExternalDirectoryObjectId, GrantSendOnBehalfTo -ExpandProperty GrantSendOnBehalfTo}
    
  • In einer REST-API-Sitzung: Führen Sie den folgenden Befehl aus:

    $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
    }
    

Szenario 3: Ausführen Exchange Online Cmdlets in einer bestimmten PowerShell-Sitzung, wenn mehrere Sitzungen vorhanden sind

In diesem Beispiel wird gezeigt, wie Sie zwei PowerShell-Sitzungen im selben Fenster erstellen und das Cmdlet Get-Mailbox in jeder Sitzung ausführen.

  • In einer PowerShell-Remotesitzung:

    1. Verwenden Sie das Cmdlet Get-PSSession , um die ersten PowerShell-Remotesitzungsdetails in der Variablen namens $Session1zu speichern.

    2. Verwenden Sie das Cmdlet Get-PSSession , um die details der zweiten PowerShell-Remotesitzung in der Variablen namens $Session2zu speichern.

    3. Führen Sie die folgenden Befehle aus:

      Invoke-Command -Session $Session1 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
      Invoke-Command -Session $Session2 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
  • In einer REST-API-Sitzung:

    1. Verwenden Sie im ersten Connect-ExchangeOnline-Befehl den Parameter Prefix mit dem Wert C1.

    2. Speichern Sie die ersten REST-API-Verbindungsdetails in der Variablen namens $ConnectionInfo1 , indem Sie den folgenden Befehl ausführen:

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C1"}
      
    3. Verwenden Sie im zweiten Connect-ExchangeOnline-Befehl den Parameter Prefix mit dem Wert C2.

    4. Speichern Sie die details der zweiten REST-API-Verbindung in der Variablen namens $ConnectionInfo2 , indem Sie den folgenden Befehl ausführen:

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C2"}
      
    5. Jetzt können Sie Befehle in beiden Sitzungen ausführen. Beispiel:

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

      Oder

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