Estatística de mailbox quota no Exchange 2010 – PSH Script

Where's my mail?

Em minha opinião, o Exchange é um dos produtos mais maduros da Microsoft. Não somente por ter uma longa história de mercado - Microsoft Mail (1991), Exchange 4.0 (1996), Exchange 5.0 e 5.5 (1997), Exchange 2000 (2000), Exchange 2003 (2003), Exchange 2007 (2006) e o atual Exchange 2010 (2009) - mas também por ser um dos serviços de mensageria mais utilizado no mundo. Em outras palavras, o número de usuários Exchange aumentou muito ao longo dos anos, pressionando a Microsoft a encontrar novas soluções que atendam a constante mudança de comportamento no uso de tecnologia.

Agora, as equipes de informática também precisam se desvincular dos modelos de gerenciamento antigos, baseados em premissas que diferem dos dias de hoje. Por exemplo, no Exchange 5.5 só era possível ter uma base de dados por servidor, e nessa época ainda não era comum utilizar discos externos (SAN, NAS). Esse cenário não permitia que houvesse planejamento de utilização e distribuição dos usuários. Lembro que o sistema de disco mais avançado ainda era o SCSI.

Quando o Exchange 2000 foi lançado, muitas coisas foram alteradas, como a integração com o Active Directory e a possibilidade de se ter até 20 bases Exchange por servidor (4 storage groups com 5 bases Exchange em cada uma delas).

A divisão dos usuários nas bases Exchange era realizada de várias formas. A mais comum seguia a pratica de dividir os usuários comuns pela sua inicial e manter usuários VIPs e caixas corporativas em suas próprias bases Exchange. Entretanto, a partir do Exchange 2007 o time de Exchange preocupado em melhorar o desempenho do produto publicou uma planilha que fazia uma simulação da distribuição de usuários por base de dados em relação à tecnologia de discos e a arquitetura disponível. A mesma prática também foi adotada para o Exchange 2010 e hoje a planilha é um recurso valioso para o correto planejamento da arquitetura do Exchange.

Contudo, a planilha, por questões de desempenho, recomenda misturar tipos de perfil diferentes em uma mesma base Exchange, para que o tamanho das bases siga a mesma tendência de crescimento e utilização de I/O. Para facilitar vamos dar uma olhada em um trecho da planilha, simulando um ambiente com 15.000 caixas postais:

Perfil

Qtde. Mailbox

Tam. Max. Mailbox

Tam. Médio da Mensagem

Capacidade de Envio/Recebimento por mailbox por dia

Delete Itens Retention

# Mailboxes / Database

Padrão

13.000

500 MB

75 KB

100

14 dias

1.444

Corporativas

1.500

1024 MB

75 KB

150

14 dias

167

VIPs

500

2048 MB

75 KB

150

14 dias

56

TOTAL

15.000

       

1.667

Neste caso, cada base deve ter 1667 usuários, sendo 1444 do tipo padrão, 167 caixas corporativas e 56 VIPs.

A pergunta que não quer calar é: Como gerenciar, aprovisionar e monitorar caixas postais em cada base Exchange?

A resposta, como todos já devem saber, é que depende do processo e modelo de cada empresa. A boa notícia é desenvolvi um script em PSH que faz parte do trabalho para gerenciar/monitorar os usuários de cada base Exchange. O script verifica os valores de ProhibitSendQuota de cada caixa postal, e se o valor é definido pela politica ou não, listando quantos usuários estão utilizando o mesmo valor de quota. Abaixo um exemplo da saída do script. A primeira coluna é o valor do campo ProhibitSendQuota, a segunda coluna é a quantidade de usuários que tem o mesmo valor de quota e a última coluna a porcentagem destes em relação ao total da base.

92 MB - 987 - 98.7 %
273 MB - 1 - 0.1 %
972 MB - 4 - 0.4 %
190 MB - 1 - 0.1 %
283 MB - 1 - 0.1 %
143 MB - 1 - 0.1 %
140 MB - 4 - 0.4 %
954 MB - 1 - 0.1 %
Total de usuarios: 1000

Abaixo o código do script. Fica a sugestão de alguém desenvolver a parte do aprovisionamento automático. Se quiser pode me repassar o código para eu publicar aqui para a comunidade Smile with tongue out.

$db = Read-Host "Nome do Database "
$userTotal = 0
$array = @() # creates an array
$iloop = -1
$mailboxes = Get-Mailbox -Database $db -resultsize unlimited
$dbProp = Get-MailboxDatabase $db
foreach ($mailbox in $mailboxes)
{
$flag = $false
if ($mailbox.IsMailboxEnabled -eq $false) {continue}
if ($mailbox.ProhibitSendQuota -eq "unlimited" -and $mailbox.UseDatabaseQuotaDefaults -eq $false) {$PSQ = "unlimited"}
elseif ($mailbox.UseDatabaseQuotaDefaults -eq $true){$PSQ = [string]$dbProp.ProhibitSendQuota.value.toMB() + " MB" }
else {$PSQ = [string]$mailbox.ProhibitSendQuota.value.toMB() + " MB"}
if ($iloop -eq -1) {$array += ,@($PSQ, 1, 0);$iloop += 1;$userTotal += 1;continue} # adding the first item into the array
for ($count = 0; $count -le $iloop; $count++) {
Write-Debug $mailbox.Name
if ($array[$count][0] -eq $PSQ) { $array[$count][1] += 1;$flag = $true;break }
}
if ($flag -eq $false) {$array += ,@($PSQ, 1, 0);$iloop += 1 }
$userTotal += 1
}
# calcs the percentage
for ($count = 0; $count -le $iloop; $count++)
{
$array[$count][2] = [Math]::Round((100*[int]$array[$count][1])/$userTotal,2).ToString()
}
# shows result
for ($count = 0; $count -le $iloop; $count++)
{
Write-Host $array[$count][0] " - " $array[$count][1] " - " $array[$count][2] "%" -NoNewline
Write-Host
}
$msg = "`nTotal de usuarios: " + $userTotal
$msg