Через год после миграции на архивы 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
Комментариев нет:
Отправить комментарий