Обходные решения для сценариев Invoke-Command в подключениях REST API
В нескольких подключениях к Exchange Online или Безопасности & соответствия требованиям PowerShell в одном окне используется командлет Invoke-Command для выполнения сценариев или команд в определенном удаленном сеансе PowerShell. Но командлет Invoke-Command не работает в подключениях REST API к Exchange Online или Безопасности & соответствия PowerShell.
В этой статье представлены альтернативные варианты REST API для сценариев, использующих команды Invoke-Command .
Сценарий 1. Выполнение командлетов Exchange Online
В этом примере выполняется поиск удостоверения любого другого пользователя ($Us = $User.Identity
).
Совет
Для получения значений $User
и, следовательно, $Us
требовались другие команды . Эти команды не важны. Общий подход, который используется, является важным.
В удаленном сеансе PowerShell используйте командлет Get-PSSession , чтобы сохранить сведения о удаленном сеансе PowerShell в переменной с именем
$Session
, а затем выполните следующую команду:Invoke-Command -Session $Session -ScriptBlock {Get-User $Using:Us | Select-Object DistinguishedName, ExternalDirectoryObjectId} -ErrorAction SilentlyContinue
В сеансе REST API выполните следующую команду:
Get-User $Us | Format-List DistinguishedName, ExternalDirectoryObjectId
В этом примере выполняется поиск удостоверения члена группы:
В удаленном сеансе PowerShell используйте командлет Get-PSSession , чтобы сохранить сведения о удаленном сеансе PowerShell в переменной с именем
$Session
, а затем выполните следующую команду:Invoke-Command -Session $Session -ScriptBlock {Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Select-Object DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails} -ErrorAction SilentlyContinue -HideComputerName
В сеансе REST API выполните следующую команду:
Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Format-List DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails
Сценарий 2. Выполнение командлетов Exchange Online и развертывание определенных свойств
В этом примере находятся все почтовые ящики, в которых задано разрешение GrantSendOnBehalfTo, а затем возвращаются пользователи, у которых есть разрешение на почтовый ящик.
В удаленном сеансе PowerShell используйте командлет Get-PSSession , чтобы сохранить сведения о удаленном сеансе PowerShell в переменной с именем
$Session
, а затем выполните следующую команду:Invoke-Command -Session $Session -ScriptBlock {Get-Mailbox -Filter "GrantSendOnBehalfTo -ne `$null" -ErrorAction SilentlyContinue | Select-Object ExternalDirectoryObjectId, GrantSendOnBehalfTo -ExpandProperty GrantSendOnBehalfTo}
В сеансе REST API выполните следующую команду:
$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 }
Сценарий 3. Выполнение командлетов Exchange Online в определенном сеансе PowerShell при наличии нескольких сеансов
В этом примере показано, как создать два сеанса PowerShell в одном окне и выполнить командлет Get-Mailbox в каждом сеансе.
В удаленном сеансе PowerShell:
Используйте командлет Get-PSSession , чтобы сохранить сведения о первом удаленном сеансе PowerShell в переменной с именем
$Session1
.Используйте командлет Get-PSSession , чтобы сохранить сведения о втором удаленном сеансе PowerShell в переменной с именем
$Session2
.Выполните следующие команды:
Invoke-Command -Session $Session1 -ScriptBlock {Get-Mailbox -ResultSize 1} Invoke-Command -Session $Session2 -ScriptBlock {Get-Mailbox -ResultSize 1}
В сеансе REST API:
В первой команде Connect-ExchangeOnline используйте префикс параметра со значением C1.
Сохраните первые сведения о подключении REST API в переменной с именем
$ConnectionInfo1
, выполнив следующую команду:$ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C1"}
Во второй команде Connect-ExchangeOnline используйте префикс параметра со значением C2.
Сохраните вторую информацию о подключении REST API в переменной с именем
$ConnectionInfo2
, выполнив следующую команду:$ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C2"}
Теперь команды можно выполнять в любом сеансе. Пример:
$CommandStr1 = "Get-$($ConnectionInfo1.ModulePrefix)Mailbox -ResultSize 10" Invoke-Expression $CommandStr1
или
$CommandStr2 = "Get-$($ConnectionInfo2.ModulePrefix)Mailbox -ResultSize 10" Invoke-Expression $CommandStr2