AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 34407
Accepted
Richard Slater
Richard Slater
Asked: 2009-07-02 03:36:11 +0800 CST2009-07-02 03:36:11 +0800 CST 2009-07-02 03:36:11 +0800 CST

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

  • 772

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

我最想知道的领域是:

  1. 用户和整体发送/接收的消息数。
  2. 用户收件箱中有多少未读邮件。
  3. 登录时间(注意: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 脚本的建议和提交。

email exchange exchange-2003 reporting usage
  • 2 2 个回答
  • 4019 Views

2 个回答

  • Voted
  1. John Gardeniers
    2009-07-02T04:11:31+08:002009-07-02T04:11:31+08:00

    我不知道您是否可以做所有您想做的事情,但是有多种方法可以创建脚本以从 Exchange 中提取数据。就我而言,我只对邮件数量和每个邮箱的总大小感兴趣。每晚运行的 Perl 脚本会收集这些信息并将其记录到 MySQL 数据库中。然后,它使用数据库中的数据生成一个 Excel 电子表格,其中包含每个邮箱的图表以及总数。所有这些都是从我在 Internet 上找到的示例中完成的。毫无疑问,商业产品可以做类似的事情,但一两个小时的脚本编写(对我而言)更具成本效益,并为我提供了一个可以根据需要修改或添加的开放式解决方案。

    • 2
  2. Best Answer
    Evan Anderson
    2009-07-02T04:11:50+08:002009-07-02T04:11:50+08:00

    我不知道有任何现成的程序可以满足您的要求。您可以编写各种数据收集机制并报告您认为合适的数据,但您谈论的是一个相当“自定义”的解决方案。

    1. 您可以从“消息跟踪”日志中获得此信息。日志文件是 ASCII 文本,这里列出了各种事件 ID:http: //support.microsoft.com/kb/821905 我通常在所有生产安装中启用“消息跟踪”运行,因为它也是方便没有启用。启用它后,您确实会受到轻微的性能影响,但我认为这非常值得。

    2. 这可以编写脚本。您需要以有权打开每个用户邮箱的用户身份运行脚本。(您可以删除位于组织根目录的烦人的“拒绝 - 接收为”ACE,但请注意,服务包和更新可以恢复它们。无论如何,我总是删除这些烦人的 ACE——“管理员”应该能够打开任何邮箱。)这将是一个有趣的脚本,但我今天没有时间。用户可以创建服务器端规则,将未读邮件转移到其他文件夹,因此这可能无法为您提供准确的指标。

    3. 为此,您将不得不解析 Exchange Server 计算机上的安全日志。如果您想忽略 Backup Exec 的“登录”,您也需要在那里执行此操作。(无论如何,为什么 Backup Exec “登录”?你在做“砖级”备份吗?我不惜一切代价避免这些。如果我需要恢复 E2K8 中的项目,我只需恢复一个数据库页面级备份到 RSG。)信息存储维护的“上次登录”属性是单值的,因此除了解析安全日志之外,获得此属性的唯一其他方法是“轮询”该值。那将是非常低效的。

    如果您还没有考虑过,我会跟踪邮箱大小和项目数量(以计算每个项目的平均大小)。过去,我曾以这种方式“滥用”“珍贵”的 Exchange IS 空间。现在 E2K3 Standard 有 72GB 的存储限制,这不是什么大问题。即便如此,它也可以告诉您有关用户使用模式的信息。

    听起来这将是一个有趣的系统组合!

    • 1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 如何将我的所有数据从 Exchange 2003 迁移到 Exchange 2007?

  • Exchange 2007 的备份解决方案

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve