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 Remote-PowerShell-Sitzung auszuführen. Das Cmdlet "Invoke-Command" funktioniert jedoch nicht in REST-API-Verbindungen mit Exchange Online oder Security & Compliance PowerShell.

Dieser Artikel bietet REST-API-Alternativen für Szenarien, die Invoke-Command-Befehle verwenden.

Szenario 1: Ausführen von Exchange Online-Cmdlets

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

Tipp

Andere Befehle waren erforderlich, um die Werte von $User und daher $Uszu erhalten. Diese Befehle sind nicht wichtig. Der Gesamtansatz, der verwendet wird, ist wichtig.

  • In einer Remote-PowerShell-Sitzung: Verwenden Sie das Cmdlet Get-PSSession, um die Details der Remote-PowerShell-Sitzung 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 ermittelt:

  • In einer Remote-PowerShell-Sitzung: Verwenden Sie das Cmdlet Get-PSSession, um die Details der Remote-PowerShell-Sitzung 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 von Exchange Online-Cmdlets und Erweitern bestimmter Eigenschaften

Dieses Beispiel sucht alle Postfächer, in denen die Berechtigung "GrantSendOnBehalfTo" festgelegt ist, und gibt dann die Benutzer zurück, die über die Berechtigung für das Postfach verfügen.

  • In einer Remote-PowerShell-Sitzung: Verwenden Sie das Cmdlet Get-PSSession, um die Details der Remote-PowerShell-Sitzung 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 von Exchange Online-Cmdlets in einer bestimmten PowerShell-Sitzung, wenn mehrere Sitzungen vorhanden sind

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

  • In einer Remote-PowerShell-Sitzung:

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

    2. Verwenden Sie das Cmdlet Get-PSSession, um die Details der zweiten Remote-PowerShell-Sitzung 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 Details der ersten REST-API-Verbindung in der benannten Variablen $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 mit dem Namen $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