Soluciones alternativas para escenarios de Invoke-Command en conexiones de API de REST

En varias conexiones a Exchange Online o a PowerShell de seguridad & cumplimiento en la misma ventana, se usa el cmdlet Invoke-Command para ejecutar scripts o comandos en una sesión de PowerShell remota específica. Pero el cmdlet Invoke-Command no funciona en conexiones de API de REST a Exchange Online o a Security & Compliance PowerShell.

En este artículo se ofrecen alternativas a la API de REST para escenarios que usan comandos Invoke-Command .

Escenario 1: Ejecutar cmdlets de Exchange Online

En este ejemplo se busca la identidad de cualquier otro usuario ($Us = $User.Identity).

Sugerencia

Se requerían otros comandos para obtener los valores de $User y, por lo tanto $Us, . Esos comandos no son importantes. El enfoque general que se está utilizando es lo importante.

  • En una sesión remota de PowerShell: Use el cmdlet Get-PSSession para almacenar los detalles de la sesión remota de PowerShell en la variable denominada $Session, y luego ejecute el siguiente comando:

    Invoke-Command -Session $Session -ScriptBlock {Get-User $Using:Us | Select-Object DistinguishedName, ExternalDirectoryObjectId} -ErrorAction SilentlyContinue
    
  • En una sesión de API de REST: Ejecute el siguiente comando:

    Get-User $Us | Format-List DistinguishedName, ExternalDirectoryObjectId
    

En este ejemplo se busca la identidad de un miembro del grupo:

  • En una sesión remota de PowerShell: Use el cmdlet Get-PSSession para almacenar los detalles de la sesión remota de PowerShell en la variable denominada $Session, y luego ejecute el siguiente comando:

    Invoke-Command -Session $Session -ScriptBlock {Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Select-Object DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails} -ErrorAction SilentlyContinue -HideComputerName
    
  • En una sesión de API de REST: Ejecute el siguiente comando:

    Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Format-List DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails
    

Escenario 2: Ejecutar cmdlets de Exchange Online y expandir propiedades específicas

En este ejemplo se buscan todos los buzones en los que se establece el permiso GrantSendOnBehalfTo y, a continuación, se devuelven los usuarios que tienen el permiso para el buzón.

  • En una sesión remota de PowerShell: Use el cmdlet Get-PSSession para almacenar los detalles de la sesión remota de PowerShell en la variable denominada $Session, y luego ejecute el siguiente comando:

    Invoke-Command -Session $Session -ScriptBlock {Get-Mailbox -Filter "GrantSendOnBehalfTo -ne `$null" -ErrorAction SilentlyContinue | Select-Object ExternalDirectoryObjectId, GrantSendOnBehalfTo -ExpandProperty GrantSendOnBehalfTo}
    
  • En una sesión de API de REST: Ejecute el siguiente comando:

    $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
    }
    

Escenario 3: Ejecutar cmdlets de Exchange Online en una sesión de PowerShell específica cuando hay varias sesiones presentes

En este ejemplo se muestra cómo crear dos sesiones de PowerShell en la misma ventana y ejecutar el cmdlet Get-Mailbox en cada sesión.

  • En una sesión remota de PowerShell:

    1. Use el cmdlet Get-PSSession para almacenar los detalles de la primera sesión remota de PowerShell en la variable denominada $Session1.

    2. Use el cmdlet Get-PSSession para almacenar los detalles de la segunda sesión remota de PowerShell en la variable denominada $Session2.

    3. Ejecute los comandos siguientes:

      Invoke-Command -Session $Session1 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
      Invoke-Command -Session $Session2 -ScriptBlock {Get-Mailbox -ResultSize 1}
      
  • En una sesión de API de REST:

    1. En el primer comando Connect-ExchangeOnline , use el parámetro Prefijo con el valor C1.

    2. Almacene los primeros detalles de conexión de la API de REST en la variable cuyo nombre se debe $ConnectionInfo1 al ejecutar el siguiente comando:

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C1"}
      
    3. En el segundo comando Connect-ExchangeOnline , use el parámetro Prefijo con el valor C2.

    4. Almacene los segundos detalles de conexión de la API de REST en la variable cuyo nombre se debe $ConnectionInfo2 mediante la ejecución del siguiente comando:

      $ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C2"}
      
    5. Ahora puede ejecutar comandos en cualquier sesión. Por ejemplo:

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

      O bien

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