ILM2007からFIM2010(ILM"2")への大きな進化として「コードレスプロビジョニング」がありますが、そういえばJOINとPROJECTIONってどこへ行ってしまったの?という話です。
答えから言うとSynchronization Ruleの中のAttribute Flowに吸収されてしまいました。
設定方法などはこれまでも解説をしてきたので細かくは割愛しますが、結果として少し注意が必要になったポイントもあるのでその点を含め今回は解説していきます。
まずおさらいですが、FIM2010においてはすべてのオブジェクトがMSILMデータベースを経由して同期されます。
入:ソースCS→Metaverse→MSILMのCS→MSILMデータベース
出:MSILMデータベース→MSILMのCS→Metaverse→ターゲットCS
ILM2007においてCS上のオブジェクトとMetaverse上のオブジェクトの関連付けを判断するのがJOINルールでした。
FIM2010でJOINルールにに対応するのがSynchronization RuleのRelationship Criteria設定です。ここに設定した属性の値が一致すればFIMは同一のオブジェクトとして扱います。
製品 | 条件 | |
JOIN | PROJECTION | |
ILM2007 | JOINルールに適合する属性を持つオブジェクトがMetaverse上に存在する | JOINルールに適合する属性を持つオブジェクトがMetaverse上に存在しない |
FIM2010 | RelationshipCriteriaに適合する属性を持つオブジェクトがMetaverse上に存在する | RelationshipCriteriaに適合する属性を持つオブジェクトがMetaverse上に存在しない |
これはILM2007のJOINルールでも同様ですが、Relationship Criteriaに指定した属性の値を変更してしまうと別のオブジェクトとして扱われてしまうので、Metaverse上に別のオブジェクトが作成されてしまうことになります。
これを避けるため、Synchronization RuleのAttribute Flow設定時にInitial Flow Only(初回、つまりPROJECTION時のみ同期する)という設定をRelationship Criteriaとなっている属性について行うことが必要です。(同様の理由でDN属性についても必要)
製品 | 動作 | |
JOIN | PROJECTION | |
ILM2007 | MAのAttributeFlowに定義された属性値が関連するMetaverse上のオブジェクトの属性に反映される | MAのAttributeFlowに定義された属性値を持つオブジェクトがMetaverse上に作成される |
FIM2010 | SynchronizationRuleのAttributeFlowのうち、Initial Flow Onlyにチェックがない属性のみが関連するMetaverse上のオブジェクトに反映される | SynchronizationRuleのAttributeFlowに定義されたすべての属性値を持つオブジェクトがMetaverse上に作成される |
横道にそれますが、このInitial Flow Onlyを使うことによる別の効果(むしろこちらが本来の使い方ですが)として、ILM2007ではRules ExtensionでProvision関数などに書く必要のあった初期値の設定をGUIから行うことができます。
例えば、ActiveDirectory上に作成するオブジェクトの初期パスワードを設定したい場合はunicodePwd属性にString値を入れたうえでInitial Flow Onlyをチェックすることで実現できます。
話を戻して設定を行う上での注意点ですが、現状のFIM2010ではRelationship Criteriaに指定した属性やDNにInitial Flow Onlyが設定されているかどうかのチェックをしてくれません。それほどややこしい設定ではないので忘れることはないとは思いますが、整合性をチェックするPowerShellがTechnet Forumに載っているので紹介しておきます。
http://social.technet.microsoft.com/Forums/en-US/ilm2/thread/a7946d62-0c15-4ade-a27c-5ed802a33efe
利用方法ですが、このスクリプトにチェック対象のMAの識別子を引数で渡して実行します。
チェック対象のMAの識別子はIdentity ManagerからILM MAのCSから取得します。
Search Connector SpaceでObject TypeがSynchronizationRuleの物を探してDisplayNameプロパティを見て対象のMAを判別し、Distinguished Nameを取得します。
スクリプトの実行結果は下記のようになります。
・整合性が取れている時
Initial Flow Config Check ====================== MA Name: MSILM SR Name: [OSR]ADDS PERSON Initial export flow is missing for the following attributes: None |
・DNにInitial Flow Onlyが設定されていない時
Initial Flow Config Check ====================== MA Name: MSILM SR Name: [OSR]ADDS PERSON Initial export flow is missing for the following attributes: - dn |
・Relationship Criteriaに設定された属性(ここではsAMAccountName)にInitial Flow Onlyが設定されていない時
Initial Flow Config Check ====================== MA Name: MSILM SR Name: [OSR]ADDS PERSON Initial export flow is missing for the following attributes: - sAMAccountName |
最後に一応ps1ファイルのソースを転記しておきます。
#--------------------------------------------------------------------------------------------------------------------------
if($args.count -ne 1) {throw "Missing DN parameter"}
$srGuid = $args[0]
#--------------------------------------------------------------------------------------------------------------------------
write-host "`nInitial Flow Config Check"
write-host "======================"
#--------------------------------------------------------------------------------------------------------------------------
$lstMA = @(get-wmiobject -class "MIIS_ManagementAgent" -namespace "root\MicrosoftIdentityIntegrationServer"`
-computername "." -filter "Type='Identity Lifecycle Management (ILM)'")
if($lstMA.count -eq 0) {throw "There is no FIM MA configured"}
#--------------------------------------------------------------------------------------------------------------------------
write-host "MA Name:" $lstMA[0].Name
$ilmMAGuid = $lstMA[0].Guid
$lstCs = @(get-wmiobject -class "MIIS_CSObject" -namespace "root\MicrosoftIdentityIntegrationServer" `
-computername "." --filter "DN='$srGuid' and MaGuid = '$ilmMaGuid'")
if($lstCs.count -eq 0) {throw "Synchronization Rule not found"}
#--------------------------------------------------------------------------------------------------------------------------
[xml]$xmlDoc = $lstCs[0].Hologram
if($xmlDoc.selectSingleNode("/entry/primary-objectclass").get_InnerText() -ne "SynchronizationRule")
{throw ("Object is no synchronization rule!")}
write-host "SR Name:" $xmlDoc.selectSingleNode("/entry/attr[@name='DisplayName']/value").get_InnerText()
if($xmlDoc.selectSingleNode("/entry/attr[@name='FlowType']/value").get_InnerText() -eq "0x0")
{throw "Synchronization rule is not outbound!"}
if($xmlDoc.selectNodes("//entry/attr[@name='RelationshipCriteria']").count -eq 0)
{throw "Relationship criteria not defined!"}
[xml]$relNodes = $xmlDoc.selectSingleNode("//entry/attr[@name='RelationshipCriteria']/value").get_InnerText()
[xml]$exportFlows = "
$xmlDoc.selectSingleNode("//entry/attr[@name='InitialFlow']").get_InnerText() +
"
$reqAttrs = @("dn")
foreach($curNode in $relNodes.selectNodes("conditions/condition/csAttribute"))
{$reqAttrs += $curNode.get_InnerText()}
$missingAttr = @()
foreach($attr in $reqAttrs)
{
if($exportFlows.selectNodes("/export-flows/export-flow[dest = '" + $attr + "']").count -eq 0)
{$missingAttr += $attr}
}
#--------------------------------------------------------------------------------------------------------------------------
write-host "`nInitial export flow is missing for the following attributes:"
if($missingAttr.length -eq 0) {write-host "None"}
else
{
foreach($item in $missingAttr){write-host " - $item"}
}
write-host ""
#--------------------------------------------------------------------------------------------------------------------------
trap
{
Write-Host "`nError: $($_.Exception.Message)" -foregroundcolor white -backgroundcolor darkred
Exit
}
#--------------------------------------------------------------------------------------------------------------------------