Soluciones alternativas para escenarios de Invoke-Command en conexiones de API REST
En varias conexiones a Exchange Online o a Security & Compliance PowerShell en la misma ventana, se usa el cmdlet Invoke-Command para ejecutar scripts o comandos en una sesión remota específica de PowerShell. Sin embargo, el cmdlet Invoke-Command no funciona en las conexiones de API REST a Exchange Online o PowerShell de cumplimiento de seguridad &.
En este artículo se ofrecen alternativas de API REST para escenarios que usan comandos Invoke-Command .
Escenario 1: Ejecución de cmdlets de Exchange Online
En este ejemplo se busca la identidad de cualquier otro usuario ($Us = $User.Identity
).
Sugerencia
Se necesitaban otros comandos para obtener los valores de $User
y, por tanto, $Us
. Esos comandos no son importantes. Lo importante es el enfoque general que se usa.
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, a continuación, 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 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, a continuación, 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 REST: ejecute el siguiente comando:
Get-Recipient -Filter "Members -eq '$($User.DistinguishedName)'" -RecipientTypeDetails MailUniversalDistributionGroup | Format-List DisplayName, ExternalDirectoryObjectId, RecipientTypeDetails
Escenario 2: Ejecución de cmdlets de Exchange Online y expansión de propiedades específicas
En este ejemplo se buscan todos los buzones donde se establece el permiso GrantSendOnBehalfTo y, a continuación, se devuelven los usuarios que tienen el permiso en 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, a continuación, 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 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: Ejecución de cmdlets de Exchange Online en una sesión específica de PowerShell cuando haya varias sesiones
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:
Use el cmdlet Get-PSSession para almacenar los primeros detalles de la sesión remota de PowerShell en la variable denominada
$Session1
.Use el cmdlet Get-PSSession para almacenar los segundos detalles de la sesión remota de PowerShell en la variable denominada
$Session2
.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 REST:
En el primer comando Connect-ExchangeOnline , use el parámetro Prefix con el valor C1.
Almacene los primeros detalles de conexión de la API REST en la variable denominada
$ConnectionInfo1
mediante la ejecución del siguiente comando:$ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C1"}
En el segundo comando Connect-ExchangeOnline , use el parámetro Prefix con el valor C2.
Almacene los segundos detalles de conexión de la API REST en la variable denominada
$ConnectionInfo2
mediante la ejecución del siguiente comando:$ConnectionInfo1 = Get-ConnectionInformation | Where-Object { $_.ModulePrefix -eq "C2"}
Ahora puede ejecutar comandos en cualquiera de las sesiones. Por ejemplo:
$CommandStr1 = "Get-$($ConnectionInfo1.ModulePrefix)Mailbox -ResultSize 10" Invoke-Expression $CommandStr1
O bien
$CommandStr2 = "Get-$($ConnectionInfo2.ModulePrefix)Mailbox -ResultSize 10" Invoke-Expression $CommandStr2