2012年4月20日金曜日

[FIM 2010]便利ツール - FIM Object Visualizer


SIer にとって、システム構築をするときに設定内容をいちいちドキュメントに転記して成果物を作成するのってかなり面倒ですし、コストがかかるポイントだったりします。
また、運用開始後も色々とシステム構成は変更されるので、運用の中で構成管理や変更管理のプロセスをどのように回していくかをしっかり設計しておかないとあっという間に誰も設定がどうなっているのかわからなくなってしまいます。

そういう時に便利なのが設定書の生成ツールです。
この手のツールは ID 管理製品の中では MaXware 製品がデフォルトで機能として組み込んでいました。(導入をするときは本当に便利でした!) MaXware 製品は設定内容を Word 文書に出力してくれたのでほぼそのままの状態で納品物が完成するレベルのクォリティでした。(SAP に買収された後もこの機能はなくなっていなかったと記憶しています)

一方 FIM 2010 ですがデフォルトでそのような気の利いた機能が提供されていないのですが先日 CodePlex に「FIM Object Visualizer」が公開されました。
簡単に言うと FIM の設定を Visual で確認できる GUI ツールです。

ツール URL : http://fimov.codeplex.com/

簡単に紹介します。

Click Once でインストールするとツールが起動するので Data メニューより Get Data をクリックします。
(内部的に PowerShell を使うので、 Set-ExecutionPolicy で実行ポリシーを Unrestricted に設定する必要があります)


























データの取得が完了すると Show メニューより各種設定を表示させることが出来ます。
(内部的には取得したデータを xml で保存しているので、運用上はその xml を履歴管理していけば良いと思います)








































例えば、同期規則(Synchronization Rules)を表示させると以下のようにデータが表示されます。



























他にも Show メニューで表示させた情報を取得するための PowerShell スクリプトの生成機能も付いています。
























先の同期規則を表示した状態で Show メニューから PowerShell Script を実行するとスクリプトが表示されます。



























なかなか便利なツールなので、FIM の運用を行う際はこのツールを組み込んでおくと良いかも知れません。

[FIM 2010 / Scripts] FIM Portal に登録されているユーザ一覧を出力する


残念ながら英語ですが Technet の FIM 2010 の Wiki には FIM に関するツールやスクリプト、設計上のベストプラクティスが多数掲載されています。
本シリーズではその中で紹介されているツール・スクリプトを日本語で紹介していこうと思います。(一部、日本語環境で動作させる上で工夫が必要なものもあるので、そのあたりを踏まえて紹介していきます)

では、早速。

FIM 2010 に限らず ID 管理システムを運用していると理論上は作成されているはずのユーザの状態が実際はどうなっているのか?など、ジョブの実行結果だけを監視していてもわかりにくい実際のデータ確認を行う必要が出てきます。
そのような場合、いちいちブラウザを立ち上げて管理画面で目視確認、というのは特に管理対象のユーザ数が数千~数万という環境では現実的ではありませんので、極力コマンドラインで一気に確認できるような運用スクリプトやツールを運用者向けに開発する場合がほとんどです。(結構こういうツール開発費用って SIer の作業スコープから漏れていたりして揉め事の原因になったりします)

製品によっては直接データベースの中をのぞいたり、専用の API を使って確認用のツールを開発する必要があったり、と方法は様々ですが、FIM 2010 の場合は FIM Resource Management Service を操作する PowerShell のコマンドレットが用意されています。

今回は初回ということで、FIM Portal に登録されているユーザの一覧を出力する方法を紹介します。

まずは、以後共通する点です。

■FIM コマンドレットを利用出来るようにする

まずは FIM のコマンドレットを使えるように Add-PSSnapin で FIMAutomation を追加します。

こんな感じです。
PS C:\> Add-PSSnapin FIMAutomation

■Resource Management Service へ接続する

FIM 上のリソースを管理しているのが Resource Management Service です。エンドポイントはデフォルトで http://[FIM Service をインストールしたサーバ]:5725/resourcemanagementservice です。
今回は FIM Service サーバ上で実行するので http://localhost:5725/resourcemanagementservice となります。

■XPath フィルタを作成する

Resource Management Service へのクエリは XPath を用いて実行します。
例えば、ユーザの情報を取得したければ /Person となりますし、更に属性値でフィルタを掛けたければ /Person[AccountName != Null] のように記載します。

■FIM の情報を取得する

export-fimconifig というコマンドを用いて FIM 上の情報を取得します。
基本的な書き方は、
export-fimconfig -uri [Resource Management Service エンドポイント] -customconfig ([XPath フィルタ])
です。
実行すると、Resource Management Service から取得したオブジェクトが返却されます。


上記を踏まえ、FIM 2010 上に登録されているユーザ一覧を取得して GridView に表示してみます。
(取得する属性はアカウント名、表示名、名、姓、作成時刻です)

以下がソースコードです。
これを ListUsers.ps1 として保存し、実行してみます。
set-variable -name URI -value "http://localhost:5725/resourcemanagementservice" -option constant 

clear

If(@(Get-PSSnapin | Where-Object {$_.Name -eq "FIMAutomation"} ).count -eq 0) {Add-PSSnapin FIMAutomation} 

$Filter = "/Person[AccountName!=Null]"
$curObject = export-fimconfig -uri $URI -onlyBaseResources -customconfig ($Filter) -ErrorVariable Err -ErrorAction SilentlyContinue 

[array]$Users = $null
foreach($Object in $curObject) 
{
 $ResetPass = New-Object PSObject
 $UserAccountName = (($Object.ResourceManagementObject.ResourceManagementAttributes | Where-Object {$_.AttributeName -eq "AccountName"}).Value)
 $ResetPass | Add-Member NoteProperty "AccountName" $UserAccountName
 $UserDisplayName = (($Object.ResourceManagementObject.ResourceManagementAttributes | Where-Object {$_.AttributeName -eq "DisplayName"}).Value)
 $ResetPass | Add-Member NoteProperty "DisplayName" $UserDisplayName
 $UserFirstName = (($Object.ResourceManagementObject.ResourceManagementAttributes | Where-Object {$_.AttributeName -eq "FirstName"}).Value)
 $ResetPass | Add-Member NoteProperty "FirstName" $UserFirstName
 $UserLastName = (($Object.ResourceManagementObject.ResourceManagementAttributes | Where-Object {$_.AttributeName -eq "LastName"}).Value)
 $ResetPass | Add-Member NoteProperty "LastName" $UserLastName
 $UserDomain = (($Object.ResourceManagementObject.ResourceManagementAttributes | Where-Object {$_.AttributeName -eq "Domain"}).Value)
 $ResetPass | Add-Member NoteProperty "Domain" $UserDomain
 $UserCreation = (($Object.ResourceManagementObject.ResourceManagementAttributes | Where-Object {$_.AttributeName -eq "CreatedTime"}).Value)
 $ResetPass | Add-Member NoteProperty "CreatedTime" $UserCreation
 $Users += $ResetPass
}

$Users | Out-GridView



実行すると GridView にユーザの一覧が表示されます。















応用すると特定の属性に値が入っているユーザのみを抽出する、なども簡単に出来るので特に期初の人事異動の結果が正しく反映されているかどうかなど、ジョブの実行結果を確認することが出来ます。