O problema é que você não pode usar a variável $ _ em um filtro. O seguinte funciona bem:
get-mailbox | foreach{$upn = $_.UserPrincipalName; Get-ADObject -Filter {UserPrincipalName -like $upn}}
Temos um domínio do AD local sincronizado com o Exchange Online no Office 365. Estou tentando usar o PowerShell para obter as informações de que preciso, mas continuo recebendo um erro e não consigo fazer com que os comandos funcionem corretamente juntos .
O que estou tentando fazer é:
1) Use GET-ADOBJECT to query my local AD for any user/person object in a specific
OU and return the UserPrincipalName
2) Pipe the returned UserPrincipalName to the GET-MAILBOX cmdlet (Exchange Online
in Office 365) and retrieve any mailbox where RecipientTypeDetails equals
“SharedMailbox”. The output will them return UserPrincipalName
3) Pipe the returned UserPrincipalName to GET-ADOBJECT and query my local AD again
for any object where msExchRemoteRecipientType isn’t equal to 100
O comando combinado do PowerShell é parecido com:
Get-ADObject -Filter {(objectClass -eq "User") -And (objectCategory -eq "Person")} -SearchBase “OU=Test,DC=domain,DC=com” -Properties UserPrincipalName | Select-Object UserPrincipalName | ForEach-Object{Get-Mailbox -Identity $_.UserPrincipalName} | Where-Object {$_.RecipientTypeDetails -eq "SharedMailbox"} | Select-Object UserPrincipalName | ForEach-Object {Get-ADObject -Filter {(UserPrincipalName -eq $_.UserPrincipalName)} -SearchBase "OU=Test,DC=domain,DC=com" –Properties msExchRemoteRecipientType} | Where-Object {$_.msExchRemoteRecipientType -ne 100}
Eu tentei diferentes variações, mas acabei com o seguinte erro:
Get-ADObject : Property: 'UserPrincipalName' not found in object of type:
'System.Management.Automation.PSCustomObject'.
At line:1 char:356
+ Get-ADObject -Filter {(objectClass -eq "User") -And (objectCategory -eq "Person")} -SearchBase “OU=Test,DC=domain,DC=com” -Properties UserPrincipalName | Select-Object UserPrincipalName | ForEach-Object{Get-Mailbox -Identity $_.UserPrincipalName} | Where-Object {$_.RecipientTypeDetails -eq "SharedMailbox"} | Select-Object UserPrincipalName | ForEach-Object {Get-ADObject -Filter {(UserPrincipalName -eq $_.UserPrincipalName)} -Search Base "OU=Test,DC=domain,DC=com" –Properties msExchRemoteRecipientType} | Where-Object {$_.msExchRemoteRecipientType -ne 100}
+ CategoryInfo : InvalidArgument: (:) [Get-ADObject], ArgumentException
+ FullyQualifiedErrorId : Property: 'UserPrincipalName' not found in object of type:
'System.Management.Automation.PSCustomObject'.,Microsoft.ActiveDirectory.Management.Commands.GetADObject
Se eu remover a última parte (a última parte do Get-ADObject):
ForEach-Object {Get-ADObject -Filter {(UserPrincipalName -eq $_.UserPrincipalName)} -Search Base "OU=Test,DC=domain,DC=com" –Properties msExchRemoteRecipientType} | Where-Object {$_.msExchRemoteRecipientType -ne 100}
Eu recebo a saída UserPrincipalName desejada.
Meu problema é canalizar a saída UserPrincipalName de Get-Mailbox para Get-ADObject. O motivo pelo qual estou usando o "ForEach-Object" é que ele corrigiu o problema ao canalizar do Get-ADObject para o Get-Mailbox, mas não está funcionando ao direcionar o Get-Mailbox para o Get-ADObject.
Eu tentei muitas maneiras diferentes de resolver isso, mas não obtive sucesso. Existe uma maneira de canalizar Get-Mailbox para Get-ADObject? Ou há algum outro truque que possa ser usado para obter a saída desejada? Posso fazer com que as “propriedades” retornadas da primeira consulta Get-ADObject passem pelo cmdlet Get-Mailbox e tenham essas “propriedades” disponíveis como saída para a segunda consulta Get-ADObject?
Obrigado
EDITAR:
Eu tenho o mesmo problema ao executar o seguinte exemplo:
Get-Mailbox "[email protected]" | Select-Object UserPrincipalName | Get-ADObject {(UserPrincipalName -eq $_.UserPrincipalName)} -SearchBase "DC=domain,DC=com"
É possível canalizar de GET-MAILBOX para GET-ADOBJECT ?