пятница, 17 января 2014 г.

Автоматическое включение архива для ящиков в Exchange 2010\2013

Через год после миграции на архивы 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

Комментариев нет:

Отправить комментарий