Получаем список почтовых ящиков 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)

Кстати Exchange Management Shell (EMS) имеет, только в 2010 SP1 почтовом сервере, свыше 500-та командлетов, так, что работать в ней можно очень серьезно.

Пишем вот такую команду:

Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress}

На выходе вы получаете список ящиков, учтите, что время получения результата, прямо завит от количества почт на сервере Exchane, поэтому консоль powershell может подвисать. У меня получился вот такой вывод, содержащий адреса электронных почтовых ящиков Exchange, вы сразу у себя заметите, что вывод команды отдается все не по алфавиту, что не всегда удобно для анализа.

выгрузка полного списка mailbox

Чтобы выгрузка списка почтовых адресов была по алфавиту, то вам нужно слегка видоизменить вашу команду:

Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | sort

В итоге я уже получил список почтовых ящиков в базе Exchange, отформатированный по алфавиту, что позволяет более упрощенно производить поиск п/я.

список почтовых ящиков в базе exchange 2013

Но результаты выгрузки списка почтовых ящиков могут быть длинными и не умещаться на экране вывода 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.

Выгрузка почт Exchange в файл

Теперь давайте мы узнаем информацию, сколько у нас адресов почтовых ящиков в базе почтового сервера, для этого выполните:

Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | measure

У меня на одном из серверов их оказалось 2159 штук.

количество почтовых ящиков в Exchange

Еще бывают задачи от руководства или сотрудников, это посчитать и получить список почтовых ящиков на определенном домене, если кто-то не в курсе, то 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 и мега крутым программистом, достаточно выучить несколько конструкций и ключей.

Оцените статью
Настройка серверов windows и linux
Добавить комментарий

  1. Curd

    Это external?

  2. Иван Семин автор

    Не совсем понял вопроса.

  3. Татьяна

    Попробовала воспользоваться вашим примером «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

    Может вы в курсе с чем это может быть связано?

  4. Артем

    Нужно подставить параметр autosize

  5. Татьяна

    Спасибо Артём, ваш ответ мне помог 🙂

  6. Юрий

    Бонусный скрипт не работает
    Не удается найти позиционный параметр, принимающий аргумент «».
    + CategoryInfo : InvalidArgument: (:) [Get-MailboxStatistics], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Get-MailboxStatistics
    + PSComputerName : xyz
    PS и скрипт не Ваш 🙂

  7. Eugene

    Тоже самое с рабочей станции можно? И как?

  8. Иван Семин автор

    Откройте ISE от имени нужного пользователя у кого есть права, подгрузите модули Exchange и вперед

  9. Максим

    А как исключить почтовые ящики на которые никто не заходил более 30 дней в комманде Get-Mailbox | select -expand EmailAddresses | %{$_.SmtpAddress} | where{$_ -like ‘*@morton.ru*’} | sort | Out-File C:\scripts\domain_mail.txt