В Exchange адресами обладают несколько типов объектов: пользователи, группы рассылок, контакты, общие папки. Иногда возникает задача определить по адресу объект, который этим адресом обладает. Учитывая, что любой из вышеуказанных объектов может обладать большим количеством дополнительных почтовых адресов, то задача становится нетривиальной. Написал небольшой скрипт.
$EMail = Read-Host "Ведите адрес электронной почты или его часть" $tmp = '*'+$EMail+'*' "Ищем объект, в электронном адресе которого содержится $EMail" "Поиск в пользовательских ящиках" Get-Mailbox -ResultSize unlimited | Where-Object {$_.EmailAddresses -like $tmp} | fl RecipientType, DisplayName "Поиск в группах рассылок" Get-DistributionGroup -ResultSize unlimited | Where-Object {$_.EmailAddresses -like $tmp} | fl RecipientType, DisplayName "Поиск в общих папках" Get-PublicFolder -Recurse -ResultSize unlimited -WarningAction SilentlyContinue | Where-Object {$_.MailEnabled -eq 'True'} | ForEach-Object {$PFName = $_.Identity; Get-MailPublicFolder $_.Identity -WarningAction SilentlyContinue | Where-Object {$_.EmailAddresses -like $tmp} | ForEach-Object { $PFName | fl MapiFolderPath}} "Поиск завершён"
Скрипт запрашивает адрес или его часть, для которого надо искать объект которому он принадлежит. Для пользователей и групп рассылок возвращается тип объекта и его имя, для общих папок путь до папки с заданным адресом (папки разделяются запятыми, а не слешем).
PS. Саша Трофимов подсказал отличный командлет Get-Recipient для решения этой же задачи. Работает быстрее, выводит данные по умолчанию в виде таблицы со столбцами “Имя, Тип объекта”. Пока ещё не придумал как в него запихнуть Get-PublicFolder для определения пути нахождения общей папки (конструкция вида Get-Recipient | Get-PublicFolder при этом отрабатывает корректно).
Мммм… А почему не сделать просто Get-Recipient? Оно быстрее же?
Саш, спасибо за наводку. Пойду скрипт переписывать =))))
>> Пока ещё не придумал как в него запихнуть Get-PublicFolder для определения пути нахождения общей папки
А в чем проблема-то? Я не Гусев, но вдруг подскажу =)
Смотри, у нас интересующих нас типа почтовых объектов всего три – пользователи, группы рассылок, и общие папки. Если для первых двух достаточно знать тип, то для общих папок желательно знать путь до папки. Вот это вот задачу и усложняет. То есть, теоретически, скрипт примерно такой должен быть:
Get-Recipient $recipient | ForEach-Object {if ($_.RecipientType -notlike ‘PublicFolder’) {fl Name,RecipientType} else {Get-PublicFolder $_ | fl Name,Parentpath}}
Только он не особо работает =)
Приветствую.
Понимаю, что тема старая, но…
Я PublicFolder по адресу искал через сопоставление guid.
Получал $guid через (Get-MailPublicFolder $ANY_EMAIL).GUID.guid
Потом делал сопоставление для получения пути:
Get-PublicFolder -Recurse | Where-Object {$_.MailRecipientGuid -like $guid}
Проверил, что для Get-Recipient работает точно так-же:
(Get-Recipient $ANY_EMAIL).GUID.guid выдает одно и тоже значение.