我们的任务是监控 Exchange 2003 的使用情况,Exchange 2003 Standard 中似乎没有内置报告组件。这是否意味着使用第三方报告服务,或者我可以使用事件接收器或日志将使用数据发送至 SQL Server 进行延迟处理?
我最想了解的领域是:
- 用户发送/接收的消息数量以及总体数量。
- 用户收件箱中有多少未读消息。
- 登录时间(注意:BackupExec“登录”到邮箱)
我还愿意接受有关衡量最终用户对功能的接受程度的良好指标的建议,因此也许是商店中的联系人数量、日历项目、会议请求、笔记等。
解决方案
我选择使用 PowerShell 从 Exchange 收集统计信息,因为转向 Exchange 2007 和 PowerShell 2.0 后,收集数据的选项更多了,而且我可以在现有基础上进行构建。
该脚本每天 04:00 运行,依赖于 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
}
用户收件箱中有多少未读邮件
最后,我们决定邮箱中的邮件总大小和数量是更有用的指标。有些员工有大量未读邮件,但他们每天都会查看电子邮件(通常是因为这些邮件是 FYI 类型的邮件,并且邮件主题告诉了他们需要知道的一切)。
因为我们只想要实时数据(尽管最多 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 脚本的建议和提交。
答案1
我不知道有任何现成的程序可以实现您所说的功能。您可以编写各种数据收集机制的脚本,并以您认为合适的方式报告这些数据,但您说的是一种相当“定制”的解决方案。
您可以从“消息跟踪”日志中获取此信息。日志文件是 ASCII 文本,各种事件 ID 列在此处:http://support.microsoft.com/kb/821905 无论如何,我通常在所有生产安装中都启用“消息跟踪”,因为它太方便了,不能不启用。启用它确实会稍微影响性能,但我认为这是值得的。
这可以编写脚本。您需要以有权打开每个用户邮箱的用户身份运行该脚本。(您可以删除组织根目录中令人讨厌的“拒绝 - 接收为”ACE,但请注意,服务包和更新可能会恢复它们。我总是无论如何都要删除这些烦人的 ACE——“管理员”应该能够打开任何邮箱。)这将是一个有趣的脚本,但我今天没有时间。用户可以创建服务器端规则,将未读邮件转移到其他文件夹,因此这可能无法为您提供准确的指标。
为此,您必须解析 Exchange Server 计算机上的安全日志。如果您想忽略 Backup Exec 的“登录”,您也需要在那里执行此操作。(Backup Exec 为什么“登录”?您是否在进行“砖级”备份?哎呀……我无论如何都会避免这些。如果我需要恢复 E2K8 中的项目,我只需将数据库页面级备份恢复到 RSG。)信息存储维护的“上次登录”属性是单值的,因此除了解析安全日志之外,获取此属性的唯一其他方法是“轮询”该值。这将非常低效。
如果您还没有考虑过,我会跟踪邮箱大小和项目数量(以计算每个项目的平均大小)。过去,我曾以这种方式发现“滥用”了“宝贵的”Exchange IS 空间。现在 E2K3 Standard 的存储限制为 72GB,这不再是一个大问题。即便如此,它也可以告诉您有关用户使用模式的信息。
听起来这将是一个有趣的系统!
答案2
我不知道您是否可以做到所有您想做的事情,但有多种方法可以创建脚本来从 Exchange 中提取数据。就我而言,我只对邮件数量和每个邮箱的总大小感兴趣。每晚运行的 Perl 脚本会收集这些信息并将其记录到 MySQL 数据库中。然后,它使用数据库中的数据生成一个 Excel 电子表格,其中包含每个邮箱的图表以及总数。所有这些都是我根据在互联网上找到的示例完成的。毫无疑问,有商业产品可以做类似的事情,但一两个小时的脚本编写更具成本效益(对我来说),并为我提供了一个开放式解决方案,我可以根据需要对其进行修改或添加。