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 von 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
$Session
zu 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
$Session
zu 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
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
$Session
zu 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
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:
Verwenden Sie das Cmdlet Get-PSSession , um die ersten PowerShell-Remotesitzungsdetails in der Variablen namens
$Session1
zu speichern.Verwenden Sie das Cmdlet Get-PSSession , um die details der zweiten PowerShell-Remotesitzung in der Variablen namens
$Session2
zu speichern.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:
Verwenden Sie im ersten Connect-ExchangeOnline-Befehl den Parameter Prefix mit dem Wert C1.
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"}
Verwenden Sie im zweiten Connect-ExchangeOnline-Befehl den Parameter Prefix mit dem Wert C2.
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"}
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