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

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

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

Page1 Page2

メタバースのルール拡張

 メタバースのルール拡張は、管理エージェント用ルール拡張に続けて、同期処理のタイミングで実行される。メタバースのルール拡張プログラミングはIMVSynchronizationインターフェイスの各種メソッド(表3)を実装する形で行う。

メソッド名 説明
Initialize ルール拡張オブジェクトを初期化する。MIISはルール拡張DLLをロードする時点でこのメソッドを呼び出す。またextensionsフォルダに新しいルール拡張DLLを保存したときにも呼び出される
Provision メタバース・エントリの変更に伴って対応するコネクタ・スペース・エントリを評価する。MIISは管理エージェントの実行中に、同期ルールによってメタバース・エントリが変更されたとき、このメソッドを呼び出す
ShouldDeleteFromMV 同期によってメタバース・エントリから切断されてディスコネクタとなったコネクタ・スペース・エントリに伴って、対応するメタバース・エントリが削除されるべきかどうかを決定する。MIISはルール拡張を使用するように設定されていた場合、オブジェクト削除ルールが発行されたときにこのメソッドを呼び出す
Terminate ルール拡張オブジェクトが必要なくなったときに呼び出される。MIISは拡張DLLがアンロードされるときに、このメソッドを呼び出す。これは通常、非アクティブ状態になってから5分経過したときに発生する。ただし、非アクティブ期間の変更はできないことと、今後のバージョンでも5分間であると仮定すべきではないことに注意されたい
IMVSynchronizationインターフェイスのメソッド群

 メタバースのプロビジョニングと呼ばれる処理は、メタバース・エントリの変更に伴って、対応するコネクタ・スペース・エントリを評価するために実行される。メタバース・エントリと接続されるコネクタ・スペース・エントリがまだ存在しない場合には、ルール拡張を記述することによって新たにコネクタ・スペース・エントリを作成することができる。ルール拡張で新規に作成されたコネクタ・スペース・エントリは、次回のエクスポート処理の実行によって実際のデータソース上に新規にオブジェクトが作成されることになる。

■プロビジョニング用のメタバース・ルール拡張プログラミングの例

 ソース3は、プロビジョニング用のメタバース・ルール拡張プログラミングの例である。

 このサンプルでは、プロビジョニングの処理として、Active Directoryに新規作成されるユーザー・アカウントについて、作成されるコンテナの指定や初期パスワードの設定方法(以下に示すサンプル・プログラムのADUserProvisionメソッド内に実装)、グループウェア用に作成されるCSVファイルのエントリの作成方法(GWProvisionメソッド内に実装)などが記述されている。こちらも詳しくはソース中のコメントを参照していただきたい。

 このソース3では、MIISから呼び出されるIMVSynchronization.Provisionメソッドの実装方法を示している。ここでは、メタバース・エントリのタイプが“Person”のときに処理を行うようになっている。

//MIISのプロビジョニング・メソッドの呼び出し
void IMVSynchronization.Provision (MVEntry mventry)
{
  string objectType = mventry.ObjectType.ToLower();
  if (objectType == "person")
  {
    //ADユーザー・アカウント用プロビジョニング
    ADUserProvision(mventry);
    //グループウェア用プロビジョニング
    GWProvision(mventry);
  }
}

//そのほかのメソッド……
ソース3 プロビジョニングのサンプル・プログラム
MIISのIMVSynchronization.Provisionメソッドの呼び出しを実装することで、プロビジョニング用のメタバース・ルール拡張を行っている。

 Active Directoryのユーザー・アカウント用プロビジョニングの処理はプライベート・メソッドのADUserProvisionを呼び出して行う。その実装コードが、次のソース4である。

//ADのユーザー・アカウント用プロビジョニング
private void ADUserProvision(MVEntry mventry)
{
  //管理エージェントの名前を指定してConnectedMAインスタンスを取得
  ConnectedMA ma = mventry.ConnectedMAs["AD_MA"];
  //接続されているコネクタの数を取得
  int connectors = ma.Connectors.Count;

  //コンテナ識別子の取得
  ReferenceValue DN = GetContainerDN(ma, mventry);

  CSEntry csentry;
  //まだ接続されたコネクタ・スペース・オブジェクトはない
  if (connectors == 0)
  {
    //新規コネクタ・スペース・エントリを作成する
    csentry = ma.Connectors.StartNewConnector("user");
    //識別子をセット
    csentry.DN = DN;
    //初期パスワードのセット
    SetInitialPasswordValue(csentry, mventry);
    //コネクタ・スペース・エントリの作成をコミット
    csentry.CommitNewConnector();
  }
  //すでに接続されたコネクタ・スペース・エントリがある
  else if (connectors == 1)
  {
    //インデックスの最初のコネクタ・スペース・エントリを取得
    csentry = ma.Connectors.ByIndex[0];
    //識別子をセット
    csentry.DN = DN;
  }
  else
  {
    //上記以外は例外を発生させる
    string ExceptionMessage;
    ExceptionMessage = "Multiple Connectors on Management Agent";
    throw new UnexpectedDataException(ExceptionMessage);
  }
}

//初期パスワードのセット
private void SetInitialPasswordValue(CSEntry csentry, MVEntry mventry)
{
  //ここではメタバース・エントリのpassword属性に初期パスワードが
  //マップされていることを前提としている
  csentry["unicodePwd"].Values.Add(mventry["password"].Value);
}

//EmployeeStatusの取得

private string GetEmployeeStatusValue(MVEntry mventry)
{
  if (!mventry["employeeStatus"].IsPresent)
  {
    return "";
  }
  return mventry["employeeStatus"].StringValue;
}

//コンテナ識別子の取得
private ReferenceValue GetContainerDN(ConnectedMA ma, MVEntry mventry)
{
  //作成先コンテナ名(Active Directoryの場合)
  string containerDN = "OU=employee,DC=domain,DC=local";
  string retiredContainerDN = "OU=retired,DC=domain,DC=local";

  //「CN=cn属性名」の文字列を作成

  string RDN = "CN=" + mventry["cn"].Value;

  ReferenceValue DN;

  //メタバース・エントリのemployeeStatus属性の値を取得
  string status = GetEmployeeStatusValue(mventry);
  if (status == "休職" || status == "退職")
  {
    //休職および退職者はretired OUへ
    DN = ma.EscapeDNComponent(RDN).Concat(retiredContainerDN);
  }
  else
  {
    //現職者はemployee OUへ
    DN = ma.EscapeDNComponent(RDN).Concat(containerDN);
  }
  return DN;
}
ソース4 Active Directoryユーザー・アカウント用プロビジョニング処理を行うコード(ソース3の続き)

 またこの例では、グループウェアはCSVファイルを生成して連携することを想定しているが、そのグループウェアのプロビジョニングの処理は、プライベート メソッドのGWProvisionで行う。その実装コードが、次のソース5だ。

//グループウェア(CSVファイル)用プロビジョニング
private void GWProvision(MVEntry mventry)
{
  //管理エージェントの名前を指定してConnectedMAインスタンスを取得
  ConnectedMA ma = mventry.ConnectedMAs["GROUPWARE_MA"];
  //接続されているコネクタの数を取得
  int connectors = ma.Connectors.Count;

  CSEntry csentry;

  //まだ接続されたコネクタ・スペース・エントリはない
  if (connectors == 0)
  {
    //新規コネクタ・スペース・エントリを作成する
    csentry = ma.Connectors.StartNewConnector("person");
    //アンカーをセット
    csentry["社員コード"].Value = mventry["employeeID"].StringValue;
    //オブジェクトの作成をコミット
    csentry.CommitNewConnector();
  }
  //すでに接続されたコネクタ・スペース・エントリがある
  else if (connectors == 1)
  {
    //何もしない
  }
  else
  {
    //上記以外は例外を発生させる
    string ExceptionMessage;
    ExceptionMessage = "Multiple Connectors on Management Agent";
    throw new UnexpectedDataException(ExceptionMessage);
  }
}
ソース5 グループウェア用CSVファイルを生成するコード(ソース4の続き)

ルール拡張プログラミングの注意点

 MIISのルール拡張プログラミングでは、ルール拡張が実行されるタイミングが重要となる。これを正しく理解していないとルール拡張が実行されるタイミングとデータソース・オブジェクトが更新されるタイミングの違いから、思わぬ失敗をするので注意が必要である。

 特に、エクスポート属性フローのルール拡張やプロビジョニングが同期処理のタイミングで実行されるのに対して、データソースのオブジェクトが実際に更新されるのは、その後の各管理エージェントのエクスポート処理のタイミングなので、同期処理の時点ではデータソース上のオブジェクトを直接操作しないように気を付けなければならない。

■ルール拡張プログラミングのデバッグ

 Visual Studio .NET 2003上で、ルール拡張プログラミングを行う場合、デバッグを行う手順は以下のとおりである。より詳しくは、MIISのSDKヘルプを参照していただきたい。

デバッグしたいソースの個所にブレークポイントを設定する

[デバッグ]メニューの[プロセス]を選択し、[プロセス]ダイアログを表示する

「miisserver.exe」を選択し、[アタッチ]ボタンをクリックする。[プロセスにアタッチ]ダイアログが表示されるので、[デバッグするプログラムの種類を選択します]で[Common Language Runtime]にチェックを入れ、[OK]ボタンをクリックしてダイアログを終了する。[プロセス]ダイアログの[閉じる]ボタンをクリックしてダイアログを閉じる

デバッグ・モードになるので、MIISのIdentity Managerで管理エージェントの同期処理(Synchronization)を実行すると、指定したブレークポイントで処理が停止する

デバッグを行う

 なお、プレビュー時に管理エージェントのSynchronizationを実行した場合でも、ルール拡張DLLが呼び出されることを覚えておくとよい。

まとめ

 以上、2回にわたり駆け足でMIISのルール拡張プログラミングについて解説してきた。前編ではMIISの基本的な概念と非常に柔軟なルール拡張機能について、また今回の後編ではMIISでのプログラミングについて、そのイメージをある程度つかんでいただけたのではないだろうか。

 ルール拡張プログラミングは.NET Framework上で動作するDLLであり、MIISが提供するインターフェイスのメソッドの中で、必要な部分だけを実装すればよいようになっている。このため、.NET Framework上でのプログラミングに慣れている開発者にとっては、開発が非常に容易である。

 いま、企業内のシステムはますます拡大し、複雑化している。そしてセキュリティに対する要望は高まる一方である。そのような状況において、ID統合やパスワード同期は、企業内のシステム管理を容易にし、セキュリティを高める第一歩となる。MIISの柔軟なルール拡張プログラミングを活用すれば、企業内のID統合を強力に推進することが可能となるだろう。

 読者諸氏が実際にMIISを利用したID統合を行うことになったとき、本稿が少しでもそのお役に立てれば幸いである。End of Article

 

 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 記事ランキング

本日 月間