2012年4月20日金曜日

[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 にユーザの一覧が表示されます。















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

0 件のコメント: