REST API 接続での Invoke-Command シナリオの回避策

同じウィンドウで Exchange Online またはセキュリティ & コンプライアンス PowerShell に複数の接続を行う場合、Invoke-Command コマンドレットを使用して、特定のリモート PowerShell セッションでスクリプトまたはコマンドを実行します。 ただし、Invoke-Command コマンドレットは、Exchange Online またはセキュリティ & コンプライアンス PowerShell への REST API 接続では機能しません。

この記事では、 Invoke-Command コマンドを使用するシナリオの REST API の代替を提供します。

シナリオ 1: Exchange Online コマンドレットを実行する

この例では、他のユーザー ($Us = $User.Identity) の ID を検索します。

ヒント

$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
    

次の例では、グループ メンバーの ID を検索します。

  • リモート 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: 複数のセッションが存在する場合に特定の PowerShell セッションで Exchange Online コマンドレットを実行する

この例では、同じウィンドウに 2 つの PowerShell セッションを作成し、各セッションで Get-Mailbox コマンドレットを実行する方法を示します。

  • リモート PowerShell セッションでは、次の操作を行います。

    1. Get-PSSession コマンドレットを使用して、最初のリモート PowerShell セッションの詳細を $Session1 という名前の変数に格納します。

    2. Get-PSSession コマンドレットを使用して、$Session2 という名前の変数に 2 番目のリモート PowerShell セッションの詳細を格納します。

    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 を持つパラメーター Prefix を使用します。

    2. 次のコマンドを実行して、最初の REST API 接続の詳細を $ConnectionInfo1 という名前の変数に格納します。

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C1"}
      
    3. 2 番目の Connect-ExchangeOnline コマンドで、パラメーター Prefix に値 C2 を使用します。

    4. 次のコマンドを実行して、2 番目の 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