Получаем список почтовых ящиков Exchange Server
Добрый день! Уважаемые читатели и гости лучшего IT блога страны pyatilistnik.org. В прошлой статье, о автоматическом подключении почтового ящика в Outlook, я рассказал, что буду чаще рассказывать про Microsoft Exchange Server, который я долго обходил стороной. Продолжаю придерживаться своему обещанию, и сегодня хочу поведать, о том как можно выгрузить список почтовых ящиков в Exchange Server, это очень часто встречающаяся необходимость, которую выполняют системные администраторы в свои трудовые будни. Я расскажу, как фильтровать все это дело, подсчитывать общее количество почтовых ящиков, и научу все это выгружать в текстовый файл, для последующего анализа. Уверен, что данная заметка окажется весьма полезной, тем людям, кто только начал работать с этим монстром от Microsoft.
Как выгрузить список почтовых ящиков в Exchange Server
Хочу отметить, что данные команды будут работать как на Microsoft Exchane Server 2010, так и на 2013-16. И так, первая задача, узнать какие активные почтовые ящики есть на нашем Exchange Server, для выполнения нашей задачей мы воспользуется командлетом powershell Get-Mailbox. Открываем Exchange Management Shell (EMS), она находится в меню "Пуск"
Кстати Exchange Management Shell (EMS) имеет, только в 2010 SP1 почтовом сервере, свыше 500-та командлетов, так, что работать в ней можно очень серьезно.
Пишем вот такую команду:
Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress}
На выходе вы получаете список ящиков, учтите, что время получения результата, прямо завит от количества почт на сервере Exchane, поэтому консоль powershell может подвисать. У меня получился вот такой вывод, содержащий адреса электронных почтовых ящиков Exchange, вы сразу у себя заметите, что вывод команды отдается все не по алфавиту, что не всегда удобно для анализа.
Чтобы выгрузка списка почтовых адресов была по алфавиту, то вам нужно слегка видоизменить вашу команду:
Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | sort
В итоге я уже получил список почтовых ящиков в базе Exchange, отформатированный по алфавиту, что позволяет более упрощенно производить поиск п/я.
Но результаты выгрузки списка почтовых ящиков могут быть длинными и не умещаться на экране вывода powershell, для этого удобно все это дело будет выгрузить в текстовый файл, по которому легко будет и производить поиск и фильтровать. Для этого в есть командлет Out-File.
Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | sort | Out-File C:\scripts\all_mailbox.txt
Где Out-File C:\scripts\all_mailbox.txt - это путь до файла all_mailbox.txt в папке C:\scripts\, вы его меняете на свое значение
[PS] WARNING: By default, only the first 1000 items are returned. Use the ResultSize parameter to specify the number of items returned. To return all items, specify "-ResultSize Unlimited". Be aware that, depending on the actual number of items, returning all items can take a long time and consume a large amount of memory. Also, we don't recommend storingn the results in a variable. Instead, pipe the results to another task or script to perform batch changes.
Обратите внимание, что по умолчанию выводится только 1000 ящиков, если нужно больше, то придется ввести параметр -ResultSize Unlimited.
Теперь давайте мы узнаем информацию, сколько у нас адресов почтовых ящиков в базе почтового сервера, для этого выполните:
Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | measure
У меня на одном из серверов их оказалось 2159 штук.
Еще бывают задачи от руководства или сотрудников, это посчитать и получить список почтовых ящиков на определенном домене, если кто-то не в курсе, то Microsoft Exchange Server позволят обслуживать огромное количество доменов, это нормальная практика. В итоге мы воспользуемся вот такой конструкцией.
Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | where{$_ -like '*@morton.ru*'} | sort | Out-File C:\scripts\domain_mail.txt
Если вы хотите получить названия почтовых адресов в организации, чаще всего это ФИО и дату их создания, то выполните такую команду:
Get-Mailbox | Select-Object Name,WhenCreated | Out-File C:\scripts\all_name.txt
Как видите я получил точную дату, когда были созданы почты в организации и кому в плане ФИО, они принадлежат.
Чтобы выгрузить список пользователей, которые не заходили в почтовый ящик более, чем 30 дней с выгрузкой в файл, то выполните
Get-Mailbox -resultsize unlimited | Get-MailboxStatistics |?{$_.LastLogonTime -lt (date).adddays(-30)} | ft DisplayName,ItemCount,LastLogonTimeLast,LogoffTime,LastLoggedOnUserAccount -auto | Out-File C:\scripts\OLD_mailbox.txt
Это позволит вам выявить пользователей, кто за зря занимает место в базе данных Exchange сервера. Еще могут быть ситуации, когда вам нужно выяснить какие почтовые адреса были созданы вашей почтовой системе, например, за последние 20 дней, для этого выполните:
Get-Mailbox | Where-Object {$_.WhenCreated –ge ((Get-Date).Adddays(-20))} | ft name, servername | Out-File C:\scripts\NEW_mailbox.txt
Обратите внимание, что в выводе ft, вы можете задавать много параметров, например, база данных database. Можно даже узнать, за конкретный месяц, так, например, получите список почтовых ящиков за сентябрь
Get-Mailbox | Where-Object {($_.WhenCreated).Month –eq 9} | ft name, servername, database
Ну и за весь год, на момент написания статьи это 2018 год.
Get-Mailbox | Where-Object {($_.WhenCreated).Year –eq 2018} | ft name, servername
Напоминаю, чтобы посчитать количество, вам нужно воспользоваться Measure-Object
Get-Mailbox | Where-Object {($_.WhenCreated).Year –eq 2018} | Measure-Object
Бонусный скрипт получения списка адресов с размерами
Get-mailbox -OrganizationalUnit "holding.com/Users/" -resultsize unlimited | sort Name | %{
$Size=Get-MailboxStatistics $_.SamAccountName
$_ | Select-object Name, SamAccountName, @{Name="Size";Expression={((($Size).TotalItemSize).value).toMB()+((($Size).TotalDeletedItemSize).value).toMB()}}} | export-csv -encoding unicode -NoTypeInformation C:\scripts\mailbox..csv
В выводе будет реальный размер почтовых ящиков в базе данных Exchange сервер с учетом удаленных писем из каталога Recoverable Items. Скачать готовый скрипт можно по ссылке слева.
Как видите получить список всех почтовых адресов в организации Exchange, очень просто, для этого не нужно быть гуру Powershell и мега крутым программистом, достаточно выучить несколько конструкций и ключей.
Это external?
Не совсем понял вопроса.
Попробовала воспользоваться вашим примером «Get-Mailbox | Select-Object Name,WhenCreated | Out-File C:\scripts\all_name.txt» на Exchange 2016 и в результате получила «обгрызенную» колонку Name:
Name WhenCreated
Сорменко Маргарита Влади… 07.12.2016 15:56:24
Ловаренко Дмитрий Владим… 07.12.2016 15:56:00
Может вы в курсе с чем это может быть связано?
Нужно подставить параметр autosize
Спасибо Артём, ваш ответ мне помог 🙂
Бонусный скрипт не работает
Не удается найти позиционный параметр, принимающий аргумент «».
+ CategoryInfo : InvalidArgument: (:) [Get-MailboxStatistics], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Get-MailboxStatistics
+ PSComputerName : xyz
PS и скрипт не Ваш 🙂
Тоже самое с рабочей станции можно? И как?
Откройте ISE от имени нужного пользователя у кого есть права, подгрузите модули Exchange и вперед
А как исключить почтовые ящики на которые никто не заходил более 30 дней в комманде Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | where{$_ -like ‘*@morton.ru*’} | sort | Out-File C:\scripts\domain_mail.txt