vol.6「レポートを携帯電話に送信してみよう」

Visual Studio .NET で専用ツールを開発

公開日: 2004 年 11 月 15 日

河端 善博

1. ツール「MomPone」の要件を定義します。

「MomPone」の要件

  • MOM の状態を携帯電話に連絡できる

  • 指定したスケジュールにて、繰り返し実行する

  • 状態は、SQL Server 上の MOM のデータベースから取得する

さらに、今回は実装をシンプルにするため、次の要件を追加します。

実装シンプル化のための追加要件

  • MomPone は、MOM サーバー上で動かす

  • メール送信は、IIS のメール サーバー機能を使う

  • メール サーバーは、MOM サーバー上で動かす

  • 定数は、ソース コード上に埋め込む

  • MomPone は、コマンドライン プログラムとする

2. 出力するメールの内容も、次のように、最新のアラートの概要を一覧する内容にします。

メール内容
件名 MOM <日時>
本文 サーバー名 発生日時
アラート レベル
アラート概要
        <table border="0" cellpadding="0" cellspacing="0" style="margin-bottom:12px;" width="100%">
          <tr>
            <td colspan="2" style="border:solid 1px #ccc; background-color:#999999; color:#fff; padding:5px;">
              <strong>メール例</strong>
            </td>
          </tr>
          <tr>
            <td style="border-bottom:solid 1px #ccc; border-left:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px; background-color:#f0f0f0;" valign="top">
              <strong>件名</strong>
            </td>
            <td style="border-bottom:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px;">MOM 11/01 10:05</td>
          </tr>
          <tr>
            <td style="border-bottom:solid 1px #ccc; border-left:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px; background-color:#f0f0f0;" valign="top">
              <strong>本文</strong>
            </td>
            <td style="border-bottom:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px;">SRV01 11/02 10:15<br /> サービスは利用できません<br /> MOM Agent heartbeat failure<br /> ~<br /> MOM01 11/02 09:37<br /> エラー<br /> Mail didn't reach some or all the recipients<br /> ~</td>
          </tr>
        </table>

        <p>
          <img alt="" src="https://msdn.microsoft.com/ja-jp/gg618058.mom_com_arrow(ja-jp,MSDN.10).gif" title="" />
        </p>
      </div>
      <p>3. これを実現するため、Visual Studio .NET 2005 では、コマンドライン プログラムとして、次の機能を実装します。</p>
      <div style="padding-left:20px;">
        <table border="0" cellpadding="0" cellspacing="0" style="margin-bottom:12px;" width="100%">
          <tr>
            <td colspan="2" style="border:solid 1px #ccc; background-color:#999999; color:#fff; padding:5px;">
              <strong>メソッド</strong>
            </td>
          </tr>
          <tr>
            <td style="border-bottom:solid 1px #ccc; border-left:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px; background-color:#f0f0f0;" valign="top">
              <strong>GetData()</strong>
            </td>
            <td style="border-bottom:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px;">MOM サーバーからデータを取り出し、データ セットにする</td>
          </tr>
          <tr>
            <td style="border-bottom:solid 1px #ccc; border-left:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px; background-color:#f0f0f0;" valign="top">
              <strong>SendMail()</strong>
            </td>
            <td style="border-bottom:solid 1px #ccc; border-right:solid #ccc 1px; padding:5px;">データ セットをメール形式に組み立て、送信する</td>
          </tr>
        </table>

        <p>
          <img alt="" src="https://msdn.microsoft.com/ja-jp/gg618058.mom_com_arrow(ja-jp,MSDN.10).gif" title="" />
        </p>
      </div>
      <p>4. まず、MOM サーバーからアラート状況を取り出す GetData () メソッドは次のようになります。</p>
      <p style="padding-left:20px; margin-bottom:24px;">
        <strong>メソッド GetData()</strong>
      </p>
    </div>
    <pre xmlns="">
      <code>private static DataSet GetData()

{ DataSet result = new DataSet(); // データベース接続を作成 using (SqlConnection c = new SqlConnection(cs)) { c.Open(); // ストアド プロシージャを利用 using (SqlCommand cmd = new SqlCommand(query, c)) { cmd.CommandType = CommandType.StoredProcedure; // データ セットを取得 using (SqlDataAdapter a = new SqlDataAdapter(cmd)) { a.Fill(result, "Result"); } } c.Close(); } return result; }

MOM のデータベース名は、「OnePoint」です。System.Data.SqlClient 名前空間の SqlConnection、SqlCommand、SqlDataAdapter を利用することにより、簡単にデータをデータ セットとして取り出すことができます。

5. 次に、データ セットを組み立ててメールを送信します。

メソッド SendMail()

private static void SendMail(DataSet ds)
{
// メールを作成
MailMessage message = new MailMessage();
message.To = to;
message.From = from;
message.Subject = String.Format(subject, DateTime.Now);
message.BodyFormat = MailFormat.Text;
message.BodyEncoding = Encoding.UTF8;
// メール本文を作成
StringBuilder sb = new StringBuilder();
foreach (DataRow r in ds.Tables["Result"].Rows)
{
sb.AppendFormat(bodyFormat, r.ItemArray);
}
message.Body = sb.ToString();
// メール送信
SmtpMail.SmtpServer = mailServer;
SmtpMail.Send(message);
}

メール送信は、System.Web.Mail 名前空間の MailMessage と SmtpMail を利用します。メール本文は、GetData() にて取得したデータ セットを元に組み立てます。以上を、コマンドライン プログラムとして、Visual Studio.NET 2003 で開発してビルドし、MOM サーバー上に「MomPone.exe」をコピーします。

6. 次に、ストアド プロシージャを開発します。SQL Server Enterprise Manager を利用して、MOM のデータベース サーバーに接続します。

データベース「OnePoint」に次のストアド プロシージャを追加します。

ストアドプロシージャ p_MomPoneAlertView

CREATE PROCEDURE p_MomPoneAlertView
AS
BEGIN
SELECT TOP 5
ComputerName AS ComputerName,
AlertLevel.Name AS AlertLevel,
SDKAlertView.Name AS AlertName,
DateAdd(hh, DateDiff(hh, GetUTCDate(), GetDate()), TimeRaised)
AS TimeRaised,
Description AS Description
FROM SDKAlertView, AlertLevel
WHERE (ResolutionState < 255) AND Severity = AlertLevel.Level
ORDER BY TimeRaised DESC
END

このストアド プロシージャは、MOM 2005 SDK のビュー「SDKAlertView」とテーブル「AlertLevel」を利用します。

ビュー「SDKAlertView」は、MOM が作成したアラートの履歴と属性を出力します。(ResolutionState < 255) により未解決のアラートにのみ絞り込んで表示しています。

7. MomPone を MOM サーバー上で実行して、テストします。

なお、MOM サーバー上に IIS の SMTP サーバーをセットアップし、127.0.0.1 に対して中継を許可しておきます。

SMTP サーバーの中継アクセスの設定例

図 5: SMTP サーバーの中継アクセスを 127.0.0.1 に許可しておきます。

8. 最後に、MomPone は、定期的にアラート状況を携帯電話にメールします。MOM サーバーのコントロール パネルの「タスク」に MomPone を登録します。

タスクの「実行するアカウント」には、MOM データベースに対してアクセス権のあるユーザーを指定しておきます。

以上で、「MomPone」が完成しました。

筆者は、MomPone を 6 時間ごとに実行する設定にしてサーバーの監視に使っています。

ページのトップへ

目次

著者