我们的任务是监控 Exchange 2003 的使用情况,Exchange 2003 Standard 中似乎没有内置报告组件。这是否意味着使用第三方报告服务,或者我可以使用事件接收器或日志将使用数据吐出到 SQL Server 以进行延迟处理?
我最想知道的领域是:
- 用户和整体发送/接收的消息数。
- 用户收件箱中有多少未读邮件。
- 登录时间(注意:BackupExec “登录”到邮箱)
我也对衡量最终用户对功能的接受度的良好指标的建议持开放态度,例如商店中的联系人数量、日历项目、会议请求、笔记等。
解决方案
我选择使用 PowerShell 从 Exchange 收集统计信息,因为在向前发展到 Exchange 2007 和 PowerShell 2.0 时,收集数据的选项更多,我可以在现有基础上进行构建。
该脚本每天在 0400 运行,并依赖于 SQL 2005/2008 服务器和安装在可访问 Exchange 邮件跟踪日志的服务器上的 LogParser。
发送/接收的消息数
我使用 LogParser.exe 构建了命令行,然后将其转换为我在以下函数的 powershell 脚本中使用的 COM 对象:
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
}
循环遍历昨天或之前创建的任何日志的功能(可以执行多个,以防它由于某种原因无法运行一天)然后删除日志文件。如果您将消息跟踪用于任何其他目的,请不要删除日志文件,请使用其他机制“将其标记为已使用”。
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
}
用户收件箱中有多少未读邮件
最后,我们认为邮箱中项目的总大小和数量是一个更有用的指标。一些员工有大量未读邮件,但每天都会检查他们的电子邮件(通常是因为它们是仅供参考的电子邮件,主题告诉他们他们需要知道的一切)。
由于我们只想要实时(尽管最多 24 小时),我需要在插入新数据之前截断表:
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;
}
然后我们使用 WMI 从 Exchange Server 中提取数据并将它们推送到 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;
}
登录时间
在使用 LogParser 查看安全事件日志后,我们从中得到的结果并没有那么有用。我们正在查看的事件 ID 是 540,它涵盖了 Outlook 登录和 OWA 登录(以及其他登录),我们认为实现这一点所需的工作量不值得回报。这部分是因为您需要按消息正文进行解析和过滤,以隔离事件 540 之外的不同类型的登录。
我欢迎其他有用的 PowerShell 脚本的建议和提交。
我不知道您是否可以做所有您想做的事情,但是有多种方法可以创建脚本以从 Exchange 中提取数据。就我而言,我只对邮件数量和每个邮箱的总大小感兴趣。每晚运行的 Perl 脚本会收集这些信息并将其记录到 MySQL 数据库中。然后,它使用数据库中的数据生成一个 Excel 电子表格,其中包含每个邮箱的图表以及总数。所有这些都是从我在 Internet 上找到的示例中完成的。毫无疑问,商业产品可以做类似的事情,但一两个小时的脚本编写(对我而言)更具成本效益,并为我提供了一个可以根据需要修改或添加的开放式解决方案。
我不知道有任何现成的程序可以满足您的要求。您可以编写各种数据收集机制并报告您认为合适的数据,但您谈论的是一个相当“自定义”的解决方案。
您可以从“消息跟踪”日志中获得此信息。日志文件是 ASCII 文本,这里列出了各种事件 ID:http: //support.microsoft.com/kb/821905 我通常在所有生产安装中启用“消息跟踪”运行,因为它也是方便没有启用。启用它后,您确实会受到轻微的性能影响,但我认为这非常值得。
这可以编写脚本。您需要以有权打开每个用户邮箱的用户身份运行脚本。(您可以删除位于组织根目录的烦人的“拒绝 - 接收为”ACE,但请注意,服务包和更新可以恢复它们。无论如何,我总是删除这些烦人的 ACE——“管理员”应该能够打开任何邮箱。)这将是一个有趣的脚本,但我今天没有时间。用户可以创建服务器端规则,将未读邮件转移到其他文件夹,因此这可能无法为您提供准确的指标。
为此,您将不得不解析 Exchange Server 计算机上的安全日志。如果您想忽略 Backup Exec 的“登录”,您也需要在那里执行此操作。(无论如何,为什么 Backup Exec “登录”?你在做“砖级”备份吗?我不惜一切代价避免这些。如果我需要恢复 E2K8 中的项目,我只需恢复一个数据库页面级备份到 RSG。)信息存储维护的“上次登录”属性是单值的,因此除了解析安全日志之外,获得此属性的唯一其他方法是“轮询”该值。那将是非常低效的。
如果您还没有考虑过,我会跟踪邮箱大小和项目数量(以计算每个项目的平均大小)。过去,我曾以这种方式“滥用”“珍贵”的 Exchange IS 空间。现在 E2K3 Standard 有 72GB 的存储限制,这不是什么大问题。即便如此,它也可以告诉您有关用户使用模式的信息。
听起来这将是一个有趣的系统组合!