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:
- Número de mensagens enviadas / recebidas pelo usuário e como um todo.
- Quantas mensagens não lidas na caixa de entrada dos usuários.
- 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.