如何监视Exchange 2003中的使用情况?

我们的任务是监控Exchange 2003的使用情况,似乎没有内置于Exchange 2003 Standard的报告组件。 这是否意味着使用第三方报告服务,或者是否可以使用事件接收器或日志将使用数据吐出到SQL Server以便进行延迟处理?

我最想知道的地方是:

  1. 用户和整体发送/接收的消息数量。
  2. 用户收件箱中有多less条未读邮件。
  3. login时间(注意:BackupExec“login”到邮箱)

我也乐于提供衡量terminal用户对function的吸引力的好指标build议,因此可能会在商店中查看联系人,日历项目,会议请求,记事等等。


我select使用PowerShell从Exchange收集统计数据,因为Exchange 2007和PowerShell 2.0的数据收集有更多的select,我可以build立在现有的基础之上。

该脚本每天运行在0400,并依赖SQL 2005/2008服务器和LogParser安装在可访问Exchange邮件跟踪日志的服务器上。

发送/接收的消息数

我使用LogParser.exe构build命令行,然后将其转换为在以下函数的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 } 

循环通过昨天或之前创build的任何日志的function(如果由于某种原因无法运行一天,则可以执行多个日志),然后删除日志文件。 如果您将邮件跟踪用于任何其他目的,请勿删除日志文件,请使用其他一些机制来“将其标记为已使用”。

 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 } 

用户收件箱中有多less条未读邮件

最后,我们决定邮箱中邮件的总大小和数量是一个更有用的指标。 有些员工有大量的未读邮件,但每天都会收到他们的电子邮件(通常是因为他们是“易通”的电子邮件,主题告诉他们他们需要知道的一切)。

由于我们只想要活(尽pipe长达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; } 

login时间

在使用LogParser查看安全事件日志之后,我们从中得到的结果并没有那么有用。 我们看到的事件ID是540,包括Outlooklogin和OWAlogin(和其他login),我们决定实施这一切所需的工作是不值得的回报。 这部分是因为您需要通过消息正文进行parsing和过滤,以隔离事件540之外的不同types的login。

我欢迎其他有用的PowerShell脚本的build议和意见。

我不知道有什么现成的程序可以做你正在谈论的内容。 你可以编写各种数据收集机制的脚本,然后报告这些数据,但是你说的是一个相当“自定义”的解决scheme。

  1. 你可以从“邮件跟踪”日志中得到这个。 日志文件是ASCII文本,并在这里列出各种事件ID: http : //support.microsoft.com/kb/821905我通常运行瓦特/“消息跟踪”启用在我所有的生产安装,无论如何,只是因为它也是方便不要启用。 启用它后,您的性能会有轻微的下滑,但我认为这不值得。

  2. 这可以是脚本。 您需要以具有打开每个用户邮箱的权限的用户身份运行该脚本。 (您可以删除位于组织根部的令人讨厌的“拒绝 – 接收为”ACE,但要注意,服务包和更新可以恢复它们。我总是删除这些烦人的ACE – “pipe理员”应该能够打开任何邮箱。)这将是一个有趣的脚本来写,但我今天没有时间。 用户可以创build服务器端的规则,将未读消息转移到其他文件夹,所以这可能不会给你一个准确的指标。

  3. 您将不得不parsingExchange Server计算机上的安全日志。 如果您想忽略来自Backup Exec的“login”,则还需要在那里执行此操作。 (为什么Backup Exec“login”,无论如何,你正在做一个“砖级”备份?Ick …我不惜一切代价避免这些,如果我需要恢复E2K8中的一个项目,我只是恢复一个数据库页面级别备份到RSG。)信息存储维护的“最后login”属性是单值的,所以除parsing安全日志外,唯一的方法是“轮询”该值。 这将是非常低效的。

如果你还没有想过,我会跟踪邮箱大小和项目数量(以计算每个项目的平均大小)。 过去我已经发现了“滥用”“交换空间”的“珍贵”空间。 现在,E2K3标准有72GB的商店限制,这不是一个大问题。 即使如此,它可以告诉你关于你的用户使用模式的事情。

听起来像这将是一个有趣的系统放在一起!

我不知道你是否可以做所有你想要的,但有很多是创build脚本从Exchange提取数据。 在我的情况下,我只关心消息的数量和每个邮箱的总大小。 每晚运行的Perl脚本收集该信息并将其logging到MySQL数据库中。 然后使用数据库中的数据为每个邮箱生成一个包含图表的Excel电子表格以及总数。 所有这一切都是从我在互联网上find的例子中完成的。 毫无疑问,商业产品做类似的,但一个小时或两个脚本是更具成本效益(为我),并给我一个开放性的解决scheme,我可以修改或添加到所需的。