Обходные решения для сценариев 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:

    1. Используйте командлет Get-PSSession , чтобы сохранить сведения о первом удаленном сеансе PowerShell в переменной с именем $Session1.

    2. Используйте командлет Get-PSSession , чтобы сохранить сведения о втором удаленном сеансе PowerShell в переменной с именем $Session2.

    3. Выполните следующие команды:

      Invoke-Command -Session $Session1 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
      Invoke-Command -Session $Session2 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
  • В сеансе REST API:

    1. В первой команде Connect-ExchangeOnline используйте префикс параметра со значением C1.

    2. Сохраните первые сведения о подключении REST API в переменной с именем $ConnectionInfo1 , выполнив следующую команду:

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C1"}
      
    3. Во второй команде Connect-ExchangeOnline используйте префикс параметра со значением C2.

    4. Сохраните вторую информацию о подключении REST API в переменной с именем $ConnectionInfo2 , выполнив следующую команду:

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C2"}
      
    5. Теперь команды можно выполнять в любом сеансе. Пример:

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

      или

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