После отпуска всегда хочется что-то начать делать, менять все в лучшую сторону т.к. голова чиста и все что есть в плане задумок вдруг как-то становится как вызов, сделать и радоваться разобранному. Ну это только для меня.

Сегодняшняя задумка, как модернизировать заметку: "Проработать как на Exchange 2010 выгрузить почтовый ящик в pst" где я оформил себе каким образом можно произвести экспорт одного почтового ящика в PST файла если почтовый сервер это Exchange 2010 (Version: 14.03.0509.000).Т.е. я хочу сделать скрип посредством которого будут раз в неделю делать дополнительную резервную копию всех почтовых ящиков определенной OU в каталог текущей даты.

Шаг №1: Чтобы экспортировать почтовый ящик с сервера Exchange 2010 нужно создать группу Mailbox Import-Export и добавить в нее административную учетную запись Exchange:

[PS] C:\windows\system32>new-rolegroup "Import-Export Admins" -Roles "Mailbox Import Export"

[PS] C:\windows\system32>add-rolegroupmember "Import-Export Admins" -Member ekzorchik

На заметку: Или можно через оснастку Active Directory Users and Computers – polygon.local – Microsoft Exchange Security Groups – добавить в группу Import-Export Admins учетную запись которая у меня является администрирующей на почтовом сервере и во всей инфраструктуре, т.е. ekzorchik.

Шаг №2: Создаем каталог на сервере (т.е. мне нужно выполнять по сети) куда буду производить экспорт почтовых ящиков в формате PST:

к примеру, на srv-shares03

@echo off

if not exist d:\mailboxespst mkdir mailboxespst

rem if nuzhno rights more grant write one line

net share mailboxespst$=d:\mailboxespst /grant:"%USERDOMAIN%\ekzorchik",FULL /grant:"%USERDOMAIN%\Exchange Trusted Subsystem",FULL

icacls d:\mailboxespst /inheritance:d

icacls d:\mailboxespst /grant "Exchange Trusted Subsystem":(OI)(CI)(M)

icacls d:\mailboxespst /grant "%USERDOMAIN%\ekzorchik":(OI)(CI)(F)

icacls d:\mailboxespst /remove:g "Users" /t

icacls d:\mailboxespst /remove:g "%COMPUTERNAME%\Users" /t

На заметку: W:\firma\tips_bat\tips_script_mailboxspst_folder.bat

Шаг №3: Проверяем что может в созданную скрытую шару выгрузить почтовый ящик в PST файл:

on srv-mail08-mb (Role: databases)

через Exchange Management Shell

[PS] C:\Windows\system32>new-mailboxexportrequest -mailbox "alektest2" -filepath "\\srv-shares03.polygon.local\mailboxespst$\alektest2.pst"

Name                                           Mailbox                                        Status

----                                           -------                                        ------

MailboxExport                                  polygon.local/Office Users/alektest2            Queued

[PS] C:\Windows\system32>get-mailboxexportrequest -mailbox "alektest2"

Name                                           Mailbox                                        Status

----                                           -------                                        ------

MailboxExport                                  polygon.local/Office Users/alektest2            Completed

смотрим размер выгруженного ящика:

Размер выгруженного почтового ящика в PST-файл.

На заметку: можно добавить ключ "-Verbose" дабы ознакомиться с расширенной информации хода работы.

Шаг №4: Делаю скрипт (mailboxexport.ps1) на основе предопределяемого списка ящиков для которых нужно делать экспорт в PST:

[PS] C:\Windows\system32>C:\Soft\mailboxexport.ps1

##### Содержимое Users.txt #####

# alektest2

# aollo

#

###########################

#Импортируем модуль работы с коммандлетами Exchange 2010

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010

##### Получаем список людей и кладём всё в переменную #####

$Mailboxes = Get-Content "C:\Windows\Temp\Users.txt"

##### Выгрузка pst-файлов по списку пользователей #####

ForEach ($exportpst in $Mailboxes)

{ write-host $exportpst, $(get-date)

#### задержка в 360 секунд, чтобы не было много запросов на экспорт ####

Start-Sleep -s "15"

New-Mailboxexportrequest -Mailbox $exportpst -filepath "\\srv-shares03.polygon.local\mailboxespst$\$exportpst.pst"

}

Шаг №5: Нужно добавить создание каталога текущего числа:

##### Содержимое Users.txt #####

# alektest2

# aollo

#

###########################

#Текущая дата

$CurrentDate = get-date -format dd-MM-yyyy

#Каталог расположения бекапов

$BackupFolder = "\\srv-shares03.polygon.local\mailboxespst$"

$BackupPath = $BackupFolder + "\" + $CurrentDate

#Функция для создания структуры каталогов

Function CheckPath ($Path) {

$Path_Exists = Test-Path -Path $Path

If ($Path_Exists -eq $False) {

New-Item $Path -Type directory

}

}

#Создаем каталог для бекапов

CheckPath $BackupPath | Out-Null

#Импортируем модуль работы с коммандлетами Exchange 2010

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010

##### Получаем список людей и кладём всё в переменную #####

$Mailboxes = Get-Content "C:\Windows\Temp\Users.txt"

##### Выгрузка pst-файлов по списку пользователей #####

ForEach ($exportpst in $Mailboxes)

{ write-host $exportpst, $(get-date)

#### задержка в 360 секунд, чтобы не было много запросов на экспорт ####

Start-Sleep -s "15"

New-Mailboxexportrequest -Mailbox $exportpst -filepath "\\srv-shares03.polygon.local\mailboxespst$\$CurrentDate\$exportpst.pst"

}

Работает.

Шаг №6: Получить список всех ящиков в определенном OU (Organization Unit)

[PS] C:\Windows\system32>Get-Mailbox -OrganizationalUnit "ou=Office Users,dc=polygon,dc=local" -resultsize unlimited

выводим только колонку Alias:

[PS] C:\Windows\system32>Get-Mailbox -OrganizationalUnit "ou=Office Users,dc=polygon,dc=local" -resultsize unlimited | Select-Object Alias

либо

Get-Mailbox -ResultSize Unlimited|Where {$_.OrganizationalUnit -eq "polygon.local/Office Users"}

в моем случае исключив все системные ящики я получил в итоге 136 ящиков

Шаг №7: Исключить из вывода определенные ящики, к примеру, системные:

[PS] C:\Windows\system32>Get-Mailbox -OrganizationalUnit "ou=Office Users,dc=polygon,dc=local" -resultsize unlimited -Filter {(Alias -notlike 'perm')} | Select-Object Alias

если несколько ящиков

[PS] C:\Windows\system32>Get-Mailbox -OrganizationalUnit "ou=Office Users,dc=polygon,dc=local" -resultsize unlimited -Filter {(Alias -notlike 'zoom') -and (Alias -notlike 'kazan')} | Select-Object Alias

т.е. подготавливаю какие это ящики и увеличиваю данную строку до вида:

Get-Mailbox -OrganizationalUnit "ou=Office Users,dc=polygon,dc=local" -resultsize unlimited -Filter {(Alias -notlike 'smolensk') -and (Alias -notlike 'rona') -and (Alias -notlike 'spb') -and (Alias -notlike 'volgograd') -and (Alias -notlike 'tomsk') -and (Alias -notlike 'kdvor') -and (Alias -notlike 'rostov') -and (Alias -notlike 'otkpolygon') -and (Alias -notlike 'manager1') -and (Alias -notlike 'manager2') -and (Alias -notlike 'robot') -and (Alias -notlike 'perm') -and (Alias -notlike 'zoom') -and (Alias -notlike 'kazan') -and (Alias -notlike 'DiscoverySearchMailbox{D919BA05-46A6-415f-80AD-7E09334BB852}') -and (Alias -notlike 'krasnodar') -and (Alias -notlike 'khabarovsk') -and (Alias -notlike 'alektest2') } | Select-Object Alias | out-file -filepath "C:\Windows\Temp\Users.txt"

Шаг №8: Скрипт посредством которого делаем экспорт всех почтовых ящиков почтового сервера Exchange 2010 где все пользователи располагаются в определенной OU за исключением Discovery Search Mailbox и всех системных ящиков в итоге получил размер в 70Gb

Резервное копирование всех почтовых ящиков определенной OU = 72Gb.

Шаг №9: Столкнулся с моментом, когда запускаю скрипт

New-MailboxExportRequest : The operation couldn't be performed because object 'imatveeva' couldn't be found on 'srv-dc03.polygon.local'.

Решение: нашел что в коммандлет экспорта ящика в PST файл нужно добавить параметр указания к какому домен контроллеру обратиться, т.е. —DomainController srv-dc01.polygon.local

Синтаксис:

New-MailboxExportRequest -Mailbox "User" -FilePath \\server\PSTExport\export.pst -DomainController <DomainController>

но вот ругается на любой контроллер домена, который я указываю, у меня их 3 штуки

Решение:

Нашел что нужно очистить запросы, которые можно просмотреть командой:

Get-MailboxExportRequest

Удаляем запросы:

#Clear Mailboxexportrequest

#Завершенные запросы на импорт можно удалить из текущей очереди с помощью команды

Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest -Confirm:$false

Get-MailboxExportRequest

Вообщем все из-за строк

Нужно из файла удалить пробелы и CRLF.

просто до этого я Users.txt получал после вставки содержимого из Excel файла который я сам формировал, а тут я хочу сделать весь скрипт без ручного способа.

Занимаюсь.

Итого: tips_script_mailboxspst_v1.ps1

##### Содержимое Users.txt #####

# alektest2

# aollo

#

###########################

# powershell -file c:\soft\tips_script_mailboxspst.ps1

#Текущая дата

$CurrentDate = get-date -format dd-MM-yyyy

#Каталог расположения бекапов

$BackupFolder = "\\srv-shares03.polygon.local\mailboxespst$"

$DomainController1 = "SRV-DC01.polygon.local"

$DomainController2 = "srv-dc02.polygon.local"

$DomainController3 = "srv-dc03.polygon.local"

$BackupPath = $BackupFolder + "\" + $CurrentDate

#Функция для создания структуры каталогов

Function CheckPath ($Path) {

$Path_Exists = Test-Path -Path $Path

If ($Path_Exists -eq $False) {

New-Item $Path -Type directory

}

}

#Создаем каталог для бекапов

CheckPath $BackupPath | Out-Null

#Импортируем модуль работы с коммандлетами Exchange 2010

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010

#Формируем список почтовых ящиков из OU=Office Users и исключаем из него системные ящики

Get-Mailbox -OrganizationalUnit "ou=Office Users,dc=polygon,dc=local" -resultsize unlimited -Filter {(Alias -notlike 'smolensk') -and (Alias -notlike 'rona') -and (Alias -notlike 'spb') -and (Alias -notlike 'volgograd') -and (Alias -notlike 'tomsk') -and (Alias -notlike 'kdvor') -and (Alias -notlike 'rostov') -and (Alias -notlike 'otkpolygon') -and (Alias -notlike 'manager1') -and (Alias -notlike 'manager2') -and (Alias -notlike 'robot') -and (Alias -notlike 'perm') -and (Alias -notlike 'zoom') -and (Alias -notlike 'kazan') -and (Alias -notlike 'DiscoverySearchMailbox{D919BA05-46A6-415f-80AD-7E09334BB852}') -and (Alias -notlike 'krasnodar') -and (Alias -notlike 'khabarovsk') -and (Alias -notlike 'alektest2') } | Select-Object Alias | out-file -filepath "C:\Windows\Temp\Users.txt" -Encoding UTF8

##### Получаем список людей и кладём всё в переменную #####

$MailboxesPath = "C:\Windows\Temp\Users.txt"

$lines = Get-Content $MailboxesPath

$lines = $lines[3..($lines.Length - 1)]

$lines | Set-Content $MailboxesPath

Write-Output $lines | Out-File -FilePath "C:\Windows\Temp\UsersFormat.txt" -Encoding UTF8

$MailLinesBoxesPath = Get-Content "C:\Windows\Temp\UsersFormat.txt"

(Get-Content C:\Windows\Temp\UsersFormat.txt) -replace '\s+$','' | Set-Content C:\Windows\Temp\Users.txt

$MailLinesBoxesPath1 = Get-Content "C:\Windows\Temp\Users.txt"

##### Выгрузка pst-файлов по списку пользователей #####

ForEach ($exportpst in $MailLinesBoxesPath1)

{ write-host $exportpst, $(get-date)

#### задержка в 360 секунд, чтобы не было много запросов на экспорт ####

Start-Sleep -s "15"

New-Mailboxexportrequest -Mailbox $exportpst -DomainController $DomainController1 -filepath "\\srv-shares03.polygon.local\mailboxespst$\$CurrentDate\$exportpst.pst"

}

#Clear Mailboxexportrequest

#Завершенные запросы на импорт можно удалить из текущей очереди с помощью команды

Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest -Confirm:$false

Get-MailboxExportRequest

Готово. Располагаю к примеру, на srv-mail08-mb в каталоге C:\soft, запускаю консоль командной строки с правами Администратора и запускаю его, как:

powershell -file c:\Soft\mailboxexport.ps1

По итогу получаю резервную копию всех действующих почтовых ящиков в формате PST.

Итого, вот что значит сходил в отпуск и открыв свой файл с задумками (tips_firma_themes_v1.txt) которые я хотел бы проработать, я первую задумку реализовал.

На этом пока все, я прощаюсь и до новых встреч, с уважением автор блога Олло Александр aka ekzorchik.

 

От ekzorchik