SCOM外部連携用Outbound Connectorを作成する

SCOM(System Center Operations Manager)と外部のツールを連携させる方法にOutboundコネクタを利用する方法があります。簡単に言えば、SCOMのアラート情報を外部に取り出す方法です。

この機能を応用することで、SCOMとモバイルアプリの連携などもできるようになります。

今回の記事ではこのOutbound Connectorについて書きたいと思います。
なお、MSDNの関連ページはこちらです。
How to Create Outbound Connectors


SCOM SDKを準備する

まずはSCOMのSDKを用意します。用意すると言っても、実はSCOMのSDKはSCOMのインストールフォルダに入っています。
System Center2012でのデフォルトインストールの場合は以下のフォルダに入っています。
 C:\Program Files\System Center 2012\Operations Manager\Console\SDK Binaries

このフォルダにこの3つのDLLファイルが見つかるはずです。
このDLLを利用してプログラムを作成します。

  • Microsoft.EnterpriseManagement.Core.dll
  • Microsoft.EnterpriseManagement.OperationsManager.dll
  • Microsoft.EnterpriseManagement.Runtime.dll

Visual Studioで開発する場合は、これらのDLLを参照設定に入れておいて下さい。


プログラム全体

今回はわかりやすいように最低限の実装でプログラムを書いてみました。
機能としては初期化情報の設定を含めて下記の4つです。

  1. Outboundコネクタ初期化情報設定
  2. Outboundコネクタのインストール
  3. Outboundコネクタによるアラートの取得
  4. Outboundコネクタのアンインストール

まずはプログラムの全体は以下になります。

using System;
using System.Security;
using System.Collections.Generic;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.ConnectorFramework;
using System.Collections.ObjectModel;

namespace GetScomAlertViaConnector
{
    class Program
    {
        static void Main(string[] args)
        {
            string scomServer = "myscomserver";
            ManagementGroupConnectionSettings mgConnSetting = new ManagementGroupConnectionSettings(scomServer);

            //SCOMへのログイン情報を設定
            mgConnSetting.Domain = "mydomain";
            mgConnSetting.UserName = "myuser";

            //パスワードはSecureString形式に変換する必要があります
            string password = "mypassword";
            SecureString secPassword = new SecureString();
            foreach (char c in password)
                secPassword.AppendChar(c);
            mgConnSetting.Password = secPassword;

            //Connectorオブジェクト作成準備
            ManagementGroup mg = new ManagementGroup(mgConnSetting);
            IConnectorFrameworkManagement icfm = mg.ConnectorFramework;

            //ConnectorのユニークIDを設定
            Guid connectorGuid = new Guid("{6A1F8C0E-B8F1-4147-8C9B-5A2F98F10003}");
            
            MonitoringConnector connector;


            if (args.Length == 1)
            {
                if (args[0] == "install")
                {
                    ConnectorInfo info = new ConnectorInfo();

                    info.Description = "YOMON8connector";
                    info.DisplayName = "YOMON8connector";
                    info.Name = "YOMON8connector";

                    connector = icfm.Setup(info, connectorGuid);

                    connector.Initialize();
                }
                else if (args[0] == "uninstall")
                {
                    connector = icfm.GetConnector(connectorGuid);
                    IList<MonitoringConnectorSubscription> subscriptions;

                    subscriptions = icfm.GetConnectorSubscriptions();

                    foreach (MonitoringConnectorSubscription subscription in subscriptions)
                    {
                        if (subscription.MonitoringConnectorId == connectorGuid)
                        {
                            icfm.DeleteConnectorSubscription(subscription);
                        }
                    }

                    connector.Uninitialize();
                    icfm.Cleanup(connector);
                }
                else if (args[0] == "get")
                {
                    connector = icfm.GetConnector(connectorGuid);
                    ReadOnlyCollection<ConnectorMonitoringAlert> alerts = connector.GetMonitoringAlerts();

                    foreach (ConnectorMonitoringAlert alert in alerts)
                    {
                        Console.WriteLine(alert.MonitoringObjectFullName);
                    }
                }
                return;
            }
            else
            {
                Console.WriteLine("please check command parameters!");
            }
        }
    }
}

install,uninstall,getと引数毎に機能を組み込んでいます。

Outboundコネクタ初期化情報設定

まずはコネクタの初期化情報の部分についてです。

string scomServer = "myscomserver";
ManagementGroupConnectionSettings mgConnSetting = new ManagementGroupConnectionSettings(scomServer);

//SCOMへのログイン情報を設定
mgConnSetting.Domain = "mydomain";
mgConnSetting.UserName = "myuser";

//パスワードはSecureString形式に変換する必要があります
string password = "mypassword";
SecureString secPassword = new SecureString();
foreach (char c in password)
    secPassword.AppendChar(c);
mgConnSetting.Password = secPassword;

//Connectorオブジェクト作成準備
ManagementGroup mg = new ManagementGroup(mgConnSetting);
IConnectorFrameworkManagement icfm = mg.ConnectorFramework;

//ConnectorのユニークIDを設定
Guid connectorGuid = new Guid("{6A1F8C0E-B8F1-4147-8C9B-5A2F98F10003}");
            
MonitoringConnector connector;

説明はほとんどコメントにある通りなのですが、いくつかポイントを書きます。

まず、パスワードはSecureString形式で用意する必要があります。
SecureStringへのテキストの設定の仕方は以下の記事に書いてます。
SecureStringへ文字列を設定する方法とStringとして取り出す方法 - YOMON8.NET


Outboundコネクタは、SCOM側にインストールされます。
その際に、コネクタを一意に決定するためにGuidが利用されます。
もちろん、上記の例のGuidをそのまま使ってもらっても動きますが、Powershellで簡単に生成することもできます。

PS C:\Users\yusuke.otomo> [System.Guid]::NewGuid()
Guid
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Outboundコネクタのインストール

今度はコネクタをインストールします。
このプログラムの場合は引数に「install」を設定することで以下の部分を動かします。

if (args[0] == "install")
{
    ConnectorInfo info = new ConnectorInfo();

    info.Description = "YOMON8connector";
    info.DisplayName = "YOMON8connector";
    info.Name = "YOMON8connector";

    connector = icfm.Setup(info, connectorGuid);

    connector.Initialize();
}

プログラムを実行すると、SCOM側に内部コネクタが登録されます。

この内部コネクタに対して取得するアラートのフィルタを設定することが可能です。
条件はかなり細かく設定できます。

更に複数のフィルタを登録することも可能なので、外部との連携したいアラートを絞ることが可能です。


Outboundコネクタによるアラートの取得

SCOM側でコネクタの登録さえ上手くいけば、後は簡単にアラートを取ってくることができます。

else if (args[0] == "get")
{
     connector = icfm.GetConnector(connectorGuid);
     ReadOnlyCollection<ConnectorMonitoringAlert> alerts = connector.GetMonitoringAlerts();

     foreach (ConnectorMonitoringAlert alert in alerts)
     {
           Console.WriteLine(alert.MonitoringObjectFullName);
     }
}

今回は単純にコンソールにオブジェクトの名前をコンソールに書き出しているだけですが、
ConnectorMonitoringAlert型オブジェクトには多くの情報が入っています。
ConnectorMonitoringAlert Members (Microsoft.EnterpriseManagement.ConnectorFramework)

この情報を必要に応じて、外部のツールに飛ばすこともできますし、HTTP公開用の機能を開発し、Web APIなどを通してSCOMの情報を利用することなんかも可能です。

Outboundコネクタのアンインストール

コネクタはプログラムからアンインストールすることが可能です。
その際にGuidが必要になるので登録時に利用したGuidは覚えておくようにしてください。

else if (args[0] == "uninstall")
{
       connector = icfm.GetConnector(connectorGuid);
       IList<MonitoringConnectorSubscription> subscriptions;

       subscriptions = icfm.GetConnectorSubscriptions();

       foreach (MonitoringConnectorSubscription subscription in subscriptions)
       {
           if (subscription.MonitoringConnectorId == connectorGuid)
           {
               icfm.DeleteConnectorSubscription(subscription);
           }
       }

       connector.Uninitialize();
       icfm.Cleanup(connector);
}