特集
MIIS 2003プログラミング(後編)

柔軟なID管理を実現するMIISルール拡張プログラミング

福井 厚(Microsoft MVP 2005 - Solution Architect)
2005/07/20
Page1 Page2

 前回は、企業内の各情報システムの「ID統合」と「パスワード同期」を強力に推進するためのサーバ製品である「Microsoft Identity Integration Server 2003」(以下、MIIS)について、その基本概念と処理の流れ、ツールなどを解説した。さらに、そのMIISの処理ルールをカスタマイズ・拡張するための簡単なプログラミング(以下、MIISルール拡張プログラミング)の例を示した。

 今回はMIISルール拡張プログラミングについて、より詳しく見ていく。なお今回のプログラミングでは、前回の知識が必須となる。「メタバース」や「プロビジョニング」についての内容が分からないような場合には、もう一度前回の内容を読み直していただきたい。

MIISルール拡張プログラミング

 MIISルール拡張プログラミングは、MIISで定義されたインターフェイスのメソッドを実装することで実現する。MIISで定義されているルール拡張用のインターフェイスには以下の2種類がある(いずれもMicrosoft.MetadirectoryServices名前空間に所属するインターフェイス)。

  • 管理エージェントのルール拡張用インターフェイスであるIMASynchronizationインターフェイス

  • メタバースのルール拡張用インターフェイスであるIMVSynchronizationインターフェイス

 ルール拡張プログラミングでは、これらのインターフェイスのメソッドを実装するが、その際にメソッドのパラメータを経由してMIISで定義されているクラスのインスタンスが渡される。

 MIISでは多くのクラスが定義されているが、メソッドのパラメータとして渡されるクラスのインスタンスの中で、特に重要なものを表1に挙げる。

クラス名 説明
MVEntry MVEntryクラスはメタバース上のエントリを表す。
CSEntry CSEntryクラスはコネクタ・スペース上のエントリを表す。
ConnectedMA ConnectedMAクラスはメタバース・オブジェクトへ接続しているコネクタを含む管理エージェントを表す
Attrib AttribクラスはCSEntryとMVEntryに関連する属性を表す。Attribクラスは抽象クラスであり、このクラスを継承したサブクラスがインスタンス化される。属性のタイプには、String、Integer、Reference、Binary、Booleanがある
表1 ルール拡張で使用する重要なクラス
いずれのクラスもMicrosoft.MetadirectoryServices名前空間に所属する。

 これらのクラスは、コネクタ・スペース上の個々のエントリやメタバース上の個々のエントリを表しており、MIISが各インターフェイスのメソッドを呼び出す前に、メソッドの対象となるエントリごとにインスタンスを生成し、メソッドのパラメータとして引き渡す処理を行う。

 ルール拡張プログラミングでは、パラメータとして渡された、これらのクラスのインスタンスから値を取得したり、クラスが提供するインスタンス・メソッドを実行したり、属性に値をセットしたりすることで、コネクタ・スペース・エントリやメタバース・エントリに影響を与えることができる。

 例えば、あるデータソースのIDデータをメタバース・エントリに結合するときに、特定の条件に一致するIDデータは結合したくない場合、フィルタ・ルールにルール拡張を使用して複雑なルールを適用することができる。これを実現するには、IMASynchronization.FilterForDisconnectionメソッドに、任意のフィルタ・ルールをプログラミングする(詳しくは、後述する表2のFilterForDisconnectionの説明を参照のこと)。

 このように、ルール拡張プログラミングによって、単純な値チェックだけのルールでは実現できない、さまざまな条件を組み合わせた高度なフィルタリングが可能となる。また、フィルタ条件に一致する特定のコネクタ・スペース・エントリは、ディスコネクタ(非接続状態)となってメタバース・エントリと結合されないため、ほかのデータソースにも影響を与えなくなる。

 それでは、管理エージェントとメタバースのそれぞれのルール拡張プログラミングについてサンプル・プログラムをベースに解説していこう。

管理エージェント用のルール拡張プログラミング

 管理エージェントのルール拡張は、個々のデータソースに関連した管理エージェントごとに、それらの同期処理のタイミングで実行される。管理エージェントのルール拡張プログラミングは、IMASynchronizationインターフェイスの各種メソッド(表2)を実装する形で行う。

メソッド名 説明
Deprovision メタバース上のエントリが削除され、そのエントリと接続していたコネクタ・スペースのエントリが非接続オブジェクトになるときに呼び出される。このメソッドは呼び出されるとDeprovisonAction列挙型(Microsoft.MetadirectoryServices名前空間)の値として「Disconnect(切断)」「ExplicitDisconnect(明示的な切断)」「Delete(削除)」のいずれかを返さなければならない
FilterForDisconnection パラメータに渡されたコネクタのCSEntryオブジェクトがフィルタ対象としてディスコネクタになるかどうかを決定する。フィルタ対象とする場合は「true」を返す
Initialize ルール拡張オブジェクトを初期化する
MapAttributesForExport メタバース・エントリからコネクタ・スペース・エントリへ属性値をマップするときに呼び出される
MapAttributesForImport コネクタ・スペース・エントリからメタバース・エントリへ属性値をマップするときに呼び出される
MapAttributesForJoin メタバース・エントリを検索するためのCSEntry属性値に基づく値リストを生成するために呼び出される
ResolveJoinSearch 結合ルールが結合の衝突解決のためにルール拡張を使用するように設定されており、上記のIMASynchronization.MapAttributesForJoinメソッドが生成した値リストとメタバースの検索がマッチした結果が1つ以上あった場合に呼び出される。このメソッドは結合の衝突を解決するために、マッチした候補の中から結合先を決定して返さなければならない
ShouldProjectToMV 新しいコネクタ・スペース・エントリがメタバース・エントリに結合されなかった場合に、メタバース上に新しいエントリを投影するかどうかを決定するために呼び出される
Terminate ルール拡張オブジェクトが必要なくなったときに呼び出される
表2 IMASynchronizationインターフェイスのメソッド群

■管理エージェント用ルール拡張の例

 では管理エージェント用ルール拡張の例を紹介しよう。以下に示すサンプル・プログラム(ソース1)ではActive Directory用管理エージェントのエクスポート属性フローについてルール拡張プログラミングを行っている。

 このサンプル・プログラムでは、メタバース・エントリのemployeeStatus属性の値が「現職」の場合は、コネクタ・スペース・エントリのuserAccountControl属性にユーザー・アカウントを有効化する値を、「休職」または「退職」の場合は、無効化する値をセットしている。

 つまり、これにより人事情報などのデータソースの値を基にして、Active Directory上のアカウントを自動的に制御することが可能となる。社員数が多く、多数のアカウントを制御する必要がある企業にとってはとても魅力的な手法ではないだろうか。

 このルール拡張は管理エージェントの同期処理の時点で実行され、その後にActive Directory用の管理エージェントのエクスポート処理が実行されると、Active Directory上の対応するユーザー・アカウントがメタバースの属性値によって有効化または無効化されることになる。詳しくは、ソース・コード中のコメントを参照してほしい。

 ソース1では、IMASynchronization.MapAttributesForExportメソッドの実装方法を示している。この例ではフロー・ルール名が「userAccountControl」のときに、プライベート・メソッドのSetUserAccountStatusを呼び出す。

//MIISのエクスポート属性フロー・ルール拡張の呼び出し
void IMASynchronization.MapAttributesForExport(
string FlowRuleName, MVEntry mventry, CSEntry csentry)
{
  //コネクタ・スペース・エントリのオブジェクト・タイプが
  //user以外は処理対象外
  if (csentry.ObjectType.ToLower() != "user")
  {
    return;
  }

  switch (FlowRuleName)
  {
    //エクスポート属性フローのルール名が
    //userAccountControl
    case "userAccountControl":
      SetUserAccountStatus(mventry, csentry);
      break;

    //想定外の場合は例外を発生させる

    default:
      throw new EntryPointNotImplementedException();
  }
}
//そのほかのメソッド……
ソース1 管理エージェント・ルール拡張のサンプル・プログラム
MIISのIMASynchronization.MapAttributesForExportメソッドを実装することで、管理エージェントのルールを拡張している。

 SetUserAccountStatusメソッドは、employeeStatusの値によってアカウントを有効化、または無効化する。以下のソース2は、その実装コードである。

//UserAccountControlフラグの定数定義
const long UF_ACCOUNTDISABLE = 0x2;
const long UF_NORMAL_ACCOUNT = 0x200;

//メタバース・エントリのemployeeStatus属性の値によって
//コネクタ・スペース・エントリのuserAccountControl属性の値をセット
private void SetUserAccountStatus(MVEntry mventry, CSEntry csentry)
{
  if (mventry["employeeStatus"].IsPresent)
  {
    string status = mventry["employeeStatus"].StringValue;
    switch (status)
    {
      //現職の場合はアカウントを有効化する
      case "現職":
          EnableUserAccount(true, csentry);
          break;

      case "休職":
      case "退職":
          EnableUserAccount(false, csentry);
          break;
    }
  }
  else
  {
    //employeeStatus属性に値がない場合はアカウントを無効化
    EnableUserAccount(false, csentry);
  }
}

//UserAccountControlの現在値の取得
private long GetCurrentUserAccountControlValue(CSEntry csentry)
{
  if (csentry["userAccountControl"].IsPresent)
  {
   //存在した場合は現在の値を返す
    return csentry["userAccountControl"].IntegerValue;
  }
  return UF_NORMAL_ACCOUNT;
}

//ユーザー・アカウントの状態を変更する
//enableフラグ: trueで有効化、falseで無効化
private void EnableUserAccount(bool enable, CSEntry csentry)
{
  long currentValue = GetCurrentUserAccountControlValue(csentry);
  long newValue;

  if (enable)
  {
    //アカウントを有効化
    newValue = (currentValue | UF_NORMAL_ACCOUNT) & (~UF_ACCOUNTDISABLE);
  }
  else
  {
    //アカウントを無効化
    newValue = (currentValue | UF_ACCOUNTDISABLE);
  }
  //コネクタ・スペース・エントリのuserAccountControl属性に値をセット
  csentry["userAccountControl"].IntegerValue = newValue;
}
ソース2 Active Directoryのユーザー・アカウントを有効化/無効化するコード(ソース1の続き)

 次に、メタバースのルール拡張を見ていこう。


 INDEX
  [特集]
  MIIS 2003プログラミング(前編)
  企業システムのID統合を推進するMIISとは何か?
    1.MIISの基本概念と処理の流れ
    2.簡単なルール拡張プログラミングの例
  MIIS 2003プログラミング(後編)
  柔軟なID管理を実現するMIISルール拡張プログラミング
  1.管理エージェント用のルール拡張
    2.メタバースのルール拡張
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間