После отпуска всегда хочется что-то начать делать, менять все в лучшую сторону т.к. голова чиста и все что есть в плане задумок вдруг как-то становится как вызов, сделать и радоваться разобранному. Ну это только для меня.
Сегодняшняя задумка, как модернизировать заметку: "Проработать как на 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
смотрим размер выгруженного ящика:
На заметку: можно добавить ключ "-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
Шаг №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
Вообщем все из-за строк
просто до этого я 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.