皆様、ご無沙汰しております。私は コマンドラインツールの紹介以来なので、約 2 ヶ月ぶりの投稿ですね。今回の記事は、ILM や FIM 自体では機能を有していない処理を拡張ルールで実現する手法について書いてみたいと思います。ILM/FIM は、.NET Framework での拡張ルールを用いて運用できるという弊社サーバー製品には稀な類の製品になります。ですので、拡張ルールをフル活用でさまざまなことが実現できます。なので、ぜひ皆様に本機能のすばらしさ?体験していただき、実装できるインタフェースがあって、本当によかった~と思っていただけると、幸いです!
- 同期要件 作成されているグループオブジェクトのアクセス権に、JPDSFIM1\fimservice に対して Full Control を付与する。(すでに設定されている場合については、特に考慮しない : 本サンプルでは考慮しませんが、皆様が実施される際には考慮してくださいね!)
以下に実際に設定する項目や、拡張ルールをご紹介いたします!
- Identity Manager or Synchronization Manager での設定
1) AD-MA を開いて、[Select Attributes] を確認します。“nTSecurityDescriptor” を選択します。
2) [Configure Attribute Flow] を選択いただき、[Data source object type:] と [Metaverse object type:] に group を選択し、[Data source attribute:] に”nTSecurityDescriptor” を選択します。また、[Metaverse attribute:] に適当な属性を設定します(ここでは、<object-id> を設定しています)。[Mapping Type] には、もちろん ”Advanced” そして、[Flow Direction] では Export を選択します。[New] をクリックして、”Rules extension” を選択し、Flow rule name を任意の文字列にします(ここでは、nTSecurityDescriptor を記載します。この設定は、後の拡張ルールにかかわってきます)
- 拡張ルールについて
拡張ルールには、次のように記載します。
Public Sub MapAttributesForExport(ByVal FlowRuleName As String, _ ByVal mventry As MVEntry, ByVal csentry As CSEntry) _ Implements IMASynchronization.MapAttributesForExport ' TODO: Add export attribute flow code here Select Case FlowRuleName Case "nTSecurityDescriptor" Dim trustees() As String = {"JPDSFIM1\fimservice"} Dim sd As IADsSecurityDescriptor Dim acl As IADsAccessControlList Dim ace As IADsAccessControlEntry Dim su As IADsSecurityUtility Dim bsd() As Byte su = New ADsSecurityUtility() sd = CType(su.ConvertSecurityDescriptor _ (csentry("nTSecurityDescriptor").BinaryValue, 2, 1), _ SecurityDescriptor) bsd = CType(su.ConvertSecurityDescriptor(sd, 1, 2), Byte()) acl = CType(sd.DiscretionaryAcl, AccessControlList) ace = New AccessControlEntry() Dim trustee As String For Each trustee In trustees ace.AccessMask = 983551 ace.AceFlags = 0 ace.AceType = 0 ace.ObjectType = 0 ace.Trustee = trustee acl.AddAce(ace) Next csentry("nTSecurityDescriptor").BinaryValue = _ CType(su.ConvertSecurityDescriptor(sd, 1, 2), Byte()) Case Else ' TODO: remove the following statement and add your default script here Throw New EntryPointNotImplementedException() End Select End Sub
ポイントは、ADSI の IADsSecurityDescriptor/IADsAccessControlList/IADsAccessControlEntry/IADsSecrutiUtility を用いることです。いかに参考ドキュメントを記載したので、あわせて確認ください!
- 参考ドキュメント
ユーザー パスワードの管理 http://msdn.microsoft.com/ja-jp/library/ms180915.aspx
IADsSecurityUtility::ConvertSecurityDescriptor Method http://msdn.microsoft.com/en-us/library/aa706135.aspx - 実行例
上記実装をして、Full Import/Sync/Export の順番で同期をかけてみたところ、狙い通り付与することができました!
ぜひ、お試しください!
~ ぴろと@ILMとADSI はなんだかんだで相性がよい ~