web-dev-qa-db-ja.com

Exchange 2003で使用状況を監視する方法は?

Exchange 2003の使用状況を監視する必要がありますが、Exchange 2003Standardに組み込まれているレポートコンポーネントはないようです。これは、サードパーティのレポートサービスを使用することを意味しますか、それともイベントシンクまたはログを使用して使用状況データをSQL Serverに吐き出し、処理を遅らせることができますか?

私が最も知りたい分野は次のとおりです。

  1. ユーザーおよび全体で送受信されたメッセージの数。
  2. ユーザーの受信トレイにある未読メッセージの数。
  3. ログオン時間(注:BackupExecはメールボックスに「ログオン」します)

また、エンドユーザーによる機能の取り込みを測定するための優れた指標の提案も受け付けています。おそらく、ストア内の連絡先、カレンダーアイテム、会議出席依頼、メモなどの数です。


解決

Exchange2007およびPowerShell2.0に進むにつれて、PowerShellを使用してExchangeから統計を収集することを選択しました。データを収集するためのオプションは他にもあり、既存の基盤の上に構築できます。

スクリプトは毎日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
}

昨日またはそれ以前に作成されたログをループする関数(何らかの理由で1日実行できなかった場合に複数実行できます)は、ログファイルを削除します。他の目的でメッセージ追跡を使用している場合は、ログファイルを削除しないでください。「使用済みとしてマーク」するには、他のメカニズムを使用してください。

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スクリプトの提案や提出を歓迎します。

3
Richard Slater

私はあなたが話していることを行う既成のプログラムを知りません。さまざまなデータ収集メカニズムをスクリプト化し、そのデータについて適切と思われる方法でレポートすることができますが、かなり「カスタム」なソリューションについて話していることになります。

  1. これは「メッセージ追跡」ログから取得できます。ログファイルはASCIIテキストであり、さまざまなイベントIDがここにリストされています: http://support.Microsoft.com/kb/821905 私は通常w /を実行します "とにかく、有効にしないと便利すぎるという理由だけで、すべての本番インストールで「メッセージトラッキング」が有効になっています。有効にするとパフォーマンスがわずかに低下しますが、それ以上の価値があると思います。

  2. これはスクリプト化できます。すべてのユーザーメールボックスを開く権限を持つユーザーとしてスクリプトを実行する必要があります。 (組織のルートに配置された迷惑な「拒否-名前を付けて受信」ACEを削除することはできますが、サービスパックと更新によってそれらが復元される可能性があることに注意してください。Ialwaysとにかくこれらの迷惑なACEを削除します-「管理者」は任意のメールボックスを開くことができるはずです。)これはちょっと楽しいスクリプトですが、今日は時間がありません。ユーザーは、未読メッセージを他のフォルダーに転送するサーバー側のルールを作成する可能性があるため、正確なメトリックが得られない可能性があります。

  3. そのためには、ExchangeServerコンピューターのセキュリティログを解析する必要があります。 Backup Execからの「ログオン」を無視したい場合は、そこでも行う必要があります。 (とにかく、Backup Execが「ログオン」するのはなぜですか?「ブリックレベル」のバックアップを実行していますか?Ick ...私はそれらを絶対に避けます。E2K8でアイテムを復元する必要がある場合は、データベースページを復元するだけです。 RSGへのレベルのバックアップ。)インフォメーションストアが維持する「最後のログオン」属性は単一値であるため、セキュリティログの解析以外にこれを取得する唯一の方法は、その値を「ポーリング」することです。それは非常に非効率的です。

あなたがそれについて考えていなかったならば、私はメールボックスのサイズとアイテムの数を追跡します(アイテムごとの平均サイズを計算するために)。私は過去に「貴重な」Exchange ISスペースの「乱用」をこのように捉えました。現在、E2K3 Standardには72GBのストア制限があり、それほど大きな問題ではありません。それでも可能です。ユーザーの使用パターンについて教えてください。

このように聞こえるのは、まとめるのに楽しいシステムになるでしょう!

1
Evan Anderson

やりたいことがすべてできるかどうかはわかりませんが、Exchangeからデータを抽出するためのスクリプトを作成することはさまざまでした。私の場合、メッセージの数と各メールボックスの合計サイズにのみ関心があります。毎晩実行されるPerlスクリプトは、その情報を収集してMySQLデータベースに記録します。次に、データベース内のデータを使用して、各メールボックスのグラフと合計を含むExcelスプレッドシートを生成します。それはすべて、インターネットで見つけた例から行われました。同様のことを行う商用製品は間違いありませんが、1〜2時間のスクリプトの方が(私にとって)費用効果が高く、必要に応じて変更または追加できるオープンエンドのソリューションが得られます。

2
John Gardeniers