Через год после миграции на архивы Exchange настало время автоматизировать включение сотрудникам архивы (RetentionPolicy штампуется автоматически при создании ящика, но можно штамповать и в этом скрипте). Так как архивы хранятся на отдельном хранилище (RAID 50 против RAID 10 для основных баз), то помешать их в базы с основными ящиками будет нерационально с точки зрения траты "дорогого" пространства.
Для автоматизации этого дела я написал небольшой скрипт.
Балансировку я решил делать по принципу равномерного наполнения баз по числу ящиков (архив добавляется в базу с минимальным числом архивных ящиков). Для этого формируем словарь $db_stat с содержимым имя_бызы->число_ящиков_в_базе и функцией get-min получаем минимум. Со временем после "перемешивания" (если база разрастается до неприличных размеров, ящики из неё равномерно распределяется new-moverequest -archive по другим базам, сама база пересоздается с нуля) благодаря рандому базы должны заполняться более-менее равномерно.
Ниже приведен немного дополненный кусок модуля, в сыром виде его запускать можно, но будут отсутствовать отчеты по результатам (которые отправляются на почту и составляются из переменной $global:msg). У архивных баз есть префикс Arch*, чтобы не забивать их жестко в тело скрипта и каждый раз подгружать динамически. Сервер зовут exchange.contoso, домен - contoso. , $msg - это кусок письма с финальным отчетом по произведенным действиям, $msg_helpdesk - отчет об ошибках (код отправки отсутствует).
Итак сам скрипт:
Import-Module activedirectory
$session=New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 'http://exchange.contoso/powershell/' -Authentication Kerberos
Import-PSSession $session
$global:dc = (Get-ADDomainController -Service primarydc -Discover).hostname.value.tostring()
#------------------
function get-min ($data) {
$first=$true
foreach($key in $data.keys) {
if($first) {
$min_val=$data[$key]
$min_key=$key
$first=$false
} else {
if($data[$key] -le $min_val) {
$min_val=$data[$key]
$min_key=$key
}
}
}
return $min_key
}
function enable-archive() {
#log -msg "Enabling Archives..."
$msg=""
#формируем дату создания, совместимую с LDAP фильтром
$wcdate = "{0:yyyMMddHHmmss}.Z" -f (Get-Date).adddays(-365)
$users=@()
#пользователи старше года и без архива
try {
$users+=Get-ADUser -LDAPFilter "(&(whencreated<=$wcdate)(!msExchArchiveGUID=*))" -SearchBase "ou=OFFICES,dc=contoso" -properties displayname -Server $global:dc
}
catch {
$global:msg_helpdesk+="<br />Ошибка при сборе пользователей для активации архива :"+$_+"`n"
#log -msg "Error. Exitting"
return
}
#log -msg ($users.count+" archives to enable")
#log -msg "Collecting Arch DB data"
try {
$dbs=get-mailboxdatabase Arch* -DomainController $global:dc
#собираем число ящиков в базах
$db_stat=@{}
foreach($db in $dbs) {
$db_stat[$db.Name]=@(get-mailboxstatistics -database $db.Name -DomainController $global:dc).count
}
}
catch {
$global:msg_helpdesk+="<br />Ошибка при сборе информации о базах для активации архива :"+$_+"`n"
#log -msg "Error. Exiting"
return
}
#log -msg "Enabling Archives..."
foreach($user in $users) {
$db=get-min $db_stat
try {
enable-mailbox $user.distinguishedname -Archive -ArchiveDatabase $db -DomainController $global:dc
$msg+="<br /><font color=`"green`">Включаем архив для пользователя "+($user.displayname)+" в базе "+$db+"</font>`n"
$db_stat[$db]+=1
}
catch {
$msg+="<br />Ошибка при включении архива для пользователя "+($user.displayname)+" в базе "+$db+" :"+$_+"`n"
$msg_helpdesk+="<br />Ошибка при включении архива для пользователя "+($user.displayname)+" в базе "+$db+" :"+$_+"`n"
continue
}
}
#log -msg "...done"
#Чистим за собой
Remove-Variable users
Remove-Variable db_stat
if ($msg) {
$global:msg_eteam+="<br />Проблемы при активации архивных ящиков:`n"
$global:msg_eteam+=$msg
}
$msg=""
if ($msg_helpdesk) {
$global:msg_helpdesk+="<br />>Проблемы при активации архивных ящиков:`n"
$global:msg_helpdesk+=$msg_helpdesk
}
$msg_helpdesk=""
if ($msg_actions) {
$global:msg_eteam_actions+="<br />>События при активации архивных ящиков:`n"
$global:msg_eteam_actions+=$msg_actions
}
}
enable-archive
Комментариев нет:
Отправить комментарий