lunes, 21 de diciembre de 2015

Exchange Quota Notification

En versiones de Exchange Server anteriores a 2010 SP1, los usuarios recibían avisos por email cuando se superaba un límite de cuota. Después de Exchange 2010 SP1, el comportamiento del aviso por email cambió y desde Exchange Server 2013 el estado de la cuota no es calculado (Figura 1).

Figura 1

Muchos administradores se encuentran con la necesidad de avisar por email a los usuarios acerca del tamaño de sus buzones.

A continuación les comparto un script que realicé para que se envíe un mail a los usuarios cuando uno de los limites se sobrepasa:

#Coneccion a Server Exchange Cambiar el nombre del server Exchange en -ConnectionUri
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://FQDNServerName/PowerShell/ -Authentication Kerberos
Import-PSSession $Session

#Parametros a usar
$smtpServer="ExchangeServer.com"
$from = "Administrador "
$adminmail ="Admin@dominio.com"
#Buscar todos los usuarios con Mailbox - Aqui se puede definir un subset de usuarios para hacer pruebas
$Users=Get-Mailbox * | Select Alias

#Revisa cada usuario y toma acciones
foreach ($User in $Users) {

$UserData= get-Mailbox $User.alias | Select Name,PrimarySmtpAddress,Identity,Database,UseDatabaseQuotaDefaults,ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota
$Size= get-mailbox $UserData.Identity | Get-MailboxStatistics |Select TotalItemSize
$BaseData= get-mailboxdatabase $UserData.Database | Select Name,ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota
        If( $UserData.UseDatabaseQuotaDefaults -like $false) {
            $Lim1= $UserData.ProhibitSendReceiveQuota
            $Lim2= $UserData.ProhibitSendQuota
            $Lim3= $UserData.IssueWarningQuota
        }
        Else {
            $Lim1= $BaseData.ProhibitSendReceiveQuota
            $Lim2= $BaseData.ProhibitSendQuota
            $Lim3= $BaseData.IssueWarningQuota
        }
       
 If( $Lim1.IsUnlimited -and $Lim2.IsUnlimited -and $Lim3.IsUnlimited) {
            $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::NoChecking
        }
        Else {
            $res= $null
            If( -not $Lim1.IsUnlimited -and $Size.totalItemSize.Value -gt $Lim1) {
                $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::MailboxDisabled
            }
            Else {
                If( -not $Lim2.IsUnlimited -and $Size.totalItemSize.Value -gt $Lim2) {
                    $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::ProhibitSend
      $Porce=100*($Size.totalItemSize.Value.toMB()/$Lim2.Value.toMB())
      $limite="no poder enviar mas correos."
                }
                Else {
                    If( -not $Lim3.IsUnlimited -and $Size.totalItemSize.Value -gt $Lim3) {
                        $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::IssueWarning
   $Porce=100*($Size.totalItemSize.Value.toMB()/$Lim2.Value.toMB())
   $limite="advertencia."
                    }
                    Else {
                        $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::BelowLimit
   $Porce=100*($Size.totalItemSize.Value.toMB()/$Lim1.Value.toMB())
   $limite="OK"
                    }
                }
            }
        }

$Usuario=$UserData.Name
$email=$UserData.PrimarySmtpAddress
$Porce=[math]::Round($Porce,2)
#Envio de Email Email
    # Email Subject
    $subject="Advertencia de espacio de buzon"
    
    # Email body, con formato HTML
    $body ="
    Estimado $Usuario,
    <.p> Su buzon de correo llego al limite de $limite<.br>
    El porcentaje actual de ocupacion es de $Porce %, por favor elimine correos innecesarios<.br>
    Puede consultar la documentacion en LinkADocumento <.br>
   <.p>Gracias, <.br>
    <./P>"
# Envia Email
if ($limite -ne "OK"){
Send-Mailmessage -smtpServer $smtpServer -from $from -to $email -subject $subject -body $body -bodyasHTML -priority High 
# Envia Email al administrador para control/test
#Send-Mailmessage -smtpServer $smtpServer -from $from -to $adminmail -subject $subject -body $body -bodyasHTML -priority High 
}
}

Nota: En el script, los Tags HTML que se utilizan dentro de la variable $body, fueron modificados agregándoles un "." para que no se apliquen al formato del articulo y puedan ser vistos por el lector. Todos los "." de los Tags deben ser removidos antes de utilizar el script.