Como monitorar o uso no Exchange 2003?

3

Fomos encarregados de monitorar o uso do Exchange 2003, não parece haver um componente de relatório embutido no Exchange 2003 Standard. Isso significa usar serviços de relatório de terceiros ou posso usar coletores ou logs de eventos para cuspir dados de uso no SQL Server para processamento atrasado?

As áreas que eu gostaria de saber mais são:

  1. Número de mensagens enviadas / recebidas pelo usuário e como um todo.
  2. Quantas mensagens não lidas na caixa de entrada dos usuários.
  3. Tempos de logon (nota: BackupExec "faz logon" nas caixas de correio)

Também estou aberto a sugestões de boas métricas para medir a aceitação de recursos por parte do usuário final, talvez por isso o número de contatos, itens de calendário, solicitações de reunião, notas etc. na loja.

Solução

Eu decidi usar o PowerShell para coletar estatísticas do Exchange como encaminhadas para o Exchange 2007 e o PowerShell 2.0; há mais opções para coletar dados e posso aproveitar as fundações existentes.

O script é executado às 04:00 todos os dias e conta com um servidor SQL 2005/2008 e o LogParser sendo instalado em um servidor com acesso aos Logs de Rastreamento de Mensagens do Exchange.

Número de mensagens enviadas / recebidas

Eu construí a linha de comando usando o LogParser.exe, em seguida, transpusi-o para o objeto COM que eu uso dentro do script powershell na seguinte função:

function Execute-LogParserQueryToSQL([string] $Query)
{
    Write-Host $Query

    $LogParser = New-Object -com MSUtil.LogQuery

    $Input = New-Object -comObject MSUtil.LogQuery.W3CInputFormat

    $Output = New-Object -comObject MSUtil.LogQuery.SQLOutputFormat
    $Output.server = "<your server>"
    $Output.database = "<your database>"
    $Output.username = "<your username>"
    $Output.Password = "<your password>"

    $Result = $LogParser.ExecuteBatch($Query, $Input, $Output)

    return $Result
}

A função de percorrer todos os logs criados ontem ou antes (pode ser múltiplo caso não consiga executar um dia por algum motivo) e, em seguida, exclui o arquivo de log. Se você estiver usando o rastreamento de mensagens para qualquer outra finalidade, não exclua o arquivo de registro, use outro mecanismo para "marcá-lo como usado".

function Execute-SentReceivedSummary()
{
    $TodaysLog = ("{0}.log" -f,(Get-Date -f yyyyMMdd))
    $MessageTrackingDir = "D:\Exchange\Logs\PORSCHE.log"
    $LogsToParse = Get-ChildItem -Path $MessageTrackingDir
    $SentEmailQuery = "SELECT Date,Sender-Address AS Account,Count(*) AS Count INTO DailySentEmailByUser FROM '{0}' WHERE Event-ID=1027 GROUP BY Sender-Address,Date"
    $ReceivedEmailQuery = "SELECT Date,Recipient-Address AS Account,Count(*) AS Count INTO DailyReceivedEmailByUser FROM '{0}' WHERE Event-ID=1028 GROUP BY Recipient-Address,Date"

    foreach ($Log in $LogsToParse)
    {
        if ($Log.ToString() -ne $TodaysLog)
        {
            $Query = ($SentEmailQuery -f,$Log.FullName)
            Execute-LogParserQueryToSQL $Query

            $Query = ($ReceivedEmailQuery -f,$Log.FullName)
            Execute-LogParserQueryToSQL $Query

            Remove-Item $Log.FullName
        }
    }

    return $true
}

Quantas mensagens não lidas na caixa de entrada do usuário

No final, decidimos que o tamanho total e a contagem de itens na caixa de correio era uma métrica mais útil. Alguns funcionários tinham um grande número de mensagens não lidas, mas checavam seus e-mails todos os dias (normalmente porque eram e-mails do tipo FYI e o sujeito lhes contava tudo o que precisavam saber).

Como queríamos apenas ao vivo (embora com até 24 horas de idade), eu precisava truncar a tabela antes de inserir novos dados:

function Truncate-TotalsTable()
{
    $SqlConnection = new-object system.data.oledb.oledbconnection
    $SqlConnection.connectionstring = "<your connect string>"
    $SqlConnection.open()
    $Query = "TRUNCATE TABLE TotalsTable"
    $SqlCommand = New-Object system.data.oledb.oledbcommand
    $SqlCommand.connection = $SqlConnection
    $SqlCommand.commandtext = $Query
    $SqlCommand.executenonquery()
    $SqlConnection.close()

    return $true;
}

Em seguida, usamos o WMI para extrair os dados do Exchange Server e enviá-los para o SQL:

function Execute-MailboxTotalsQuery()
{
    $Result = Truncate-TotalsTable

    $Count = 0;

    $SqlConnection = new-object system.data.oledb.oledbconnection
    $SqlConnection.connectionstring = "<your connect string>"
    $SqlConnection.open()

    $MailboxReport = Get-Wmiobject -class Exchange_Mailbox -Namespace ROOT\MicrosoftExchangev2 -ComputerName <your exchange server>

    foreach ($Mailbox in $MailboxReport)
    {
        $MailboxDN = $Mailbox.MailboxDisplayName
        $TotalItems = [int]$Mailbox.TotalItems
        $TotalSize = [int]$Mailbox.Size

        $MailboxDN = $MailboxDN -replace "'","''"

        $Query = [String]::Format("INSERT TotalsTable Values ('{0}',{1},{2})",$MailboxDN, $TotalItems, $TotalSize)

        $SqlCommand = New-Object system.data.oledb.oledbcommand
        $SqlCommand.connection = $SqlConnection
        $SqlCommand.commandtext = $Query
        $Result = $SqlCommand.executenonquery()
    $Count = $Count + $Result
    }

    $SqlConnection.close()

    return $Count;
}

Logon Times

Depois de usar o LogParser para examinar o log de eventos de segurança, os resultados que obtivemos dele não foram tão úteis. A identificação do evento que estávamos vendo era 540, que abrangia tanto o logins do Outlook quanto o logins do OWA (e outros logins), e decidimos que a quantidade de trabalho necessária para implementar isso não valia a pena. Isto é parcialmente porque você precisaria analisar e filtrar pelo corpo da mensagem para isolar os diferentes tipos de login além do evento 540.

Congratulo-me com sugestões e envios de outros scripts úteis do PowerShell.

    
por Richard Slater 03.07.2009 / 12:11

2 respostas

1

Não conheço nenhum programa pronto para uso que faça o que você está falando. Você pode criar vários mecanismos de coleta de dados e relatar os dados conforme achar melhor, mas está falando de uma solução bastante "personalizada".

  1. Você pode obter isso dos registros "Message Tracking". Os arquivos de log são texto ASCII, e os vários IDs de eventos são listados aqui: link geralmente executado com o "Message Tracking" ativado em todas as minhas instalações de produção, de qualquer forma, só porque é muito útil não ter ativado. Você tem um ligeiro desempenho com isso ativado, mas acho que vale mais a pena.

  2. Isso pode ser roteirizado. Você precisaria executar o script como um usuário com direitos para abrir todas as caixas de correio de usuários. (Você pode remover as ACEs irritantes "Negar - Receber como" colocadas na raiz da organização, mas esteja ciente de que os service packs e as atualizações podem restaurá-los. sempre remove essas ACEs irritantes de qualquer maneira-- um "Administrador" deve ser capaz de abrir qualquer caixa de correio. Isso seria um roteiro divertido de escrever, mas eu não tenho tempo hoje. Os usuários podem criar regras do lado do servidor que desviam mensagens não lidas para outras pastas, portanto, isso pode não fornecer uma métrica precisa.

  3. Você terá que analisar o log de segurança no (s) computador (es) do Exchange Server para isso. Se você quiser ignorar os "logons" do Backup Exec, você precisará fazer isso também. (Por que o Backup Exec está "fazendo o login", afinal? Você está fazendo um backup do "nível do bloco"? Ick ... Eu evito isso a todo custo. Se eu precisar restaurar um item no E2K8, restaurei uma página do banco de dados backup de nível para um RSG.) O atributo "último logon" que mantém o armazenamento de informações é de valor único, portanto, a única outra maneira de obter isso, além de analisar o log de segurança, seria "pesquisar" esse valor. Isso seria altamente ineficiente.

Se você não pensou nisso, eu controlaria o tamanho da caixa de correio e o número de itens (para calcular o tamanho médio por item). Eu peguei "abuso" de troca "preciosa" IS espaço desta forma no passado. Agora que o E2K3 Standard tem um limite de armazenamento de 72 GB que não é um problema tão grande. Mesmo assim, pode dizer coisas sobre os padrões de uso de seus usuários.

Parece que seria um sistema divertido de montar!

    
por 01.07.2009 / 14:11
2

Eu não sei se você pode fazer o que quiser, mas há uma variedade de criar scripts para extrair dados do Exchange. No meu caso, estou interessado apenas no número de mensagens e no tamanho total de cada caixa de correio. Um script Perl que é executado a cada noite reúne essas informações e as registra em um banco de dados MySQL. Em seguida, ele usa os dados no banco de dados para gerar uma planilha do Excel com gráficos para cada caixa de correio, além do total. Tudo o que foi feito a partir de exemplos que encontrei na Internet. Não há dúvidas de que as ofertas comerciais são semelhantes, mas uma ou duas horas de script é mais econômica (para mim) e oferece uma solução aberta que posso modificar ou adicionar conforme necessário.

    
por 01.07.2009 / 14:11