26 февраля 2009 г.

ILM 2007 синхронизация пользователей AD и eDirectory

Опишу в нескольких строках о настройте Microsoft Identity Lifecycle Manage (ILM) 2007 для синхронизации пользователей между Active Directory и eDirectory.

После нескольких недель жизни на TechNet, MSDN и чтиву информации посвященной Identity Lifecycle Manager дало свои результаты.

Настраиваем MA (Management Agent) для Active Directory:

  • Properties - Тут все понятно….
AD ILM Properties
  • Connect to AD Forest - комментарии лишние
  • Configure Dir Partitions – В Containers выберем контейнеры с пользователями которые мы собираемся синхронизировать. В Password Synch отмечаем Enable this partition as a password synch. если мы собираемся синхронизировать пароли и в Targets выберем МА NetWare когда его создадим. (о настройке синхронизации паролей можно прочитать на TechNet)
AD ILM Conf Dir Part
  • Select Object Types – Выберем нужные типы объектов

AD ILM Obj Types

  • Select Attributes – Отмечаем нужные атрибуты
  • Confugure Connector Filter – нам пока не нужен
  • Configure Join and Projection Rules

AD ILM Conf Join gr

AD ILM Conf Join user
  • Confugure Attribute Flow – Настройка соответствия атрибутов которые мы хотим импортировать и экспортировать из AD в Metaverse

AD ILM Conf Attribute flow

Тут стоит обратить внимание на AD атрибут UserAccountControl, дело в то что он принимает значения, а в eDirectory атрибут loginDisabled, который отвечает за то включена или отключена учетная запись, принимает значения “True” или “False”. Что бы все корректно работало и состояние учетной записи пользователя (откл. или вкл.) синхронизировало между AD и eDir, делаем следующие:

  • Создаем атрибут Boolean в Metaverse Desinger например msDS-UserAccountDisabled
  • Указываем UserAccountControl импортировать в msDS-UserAccountDisabled, но при этом Mapping Type укажем Advanced и укажем Flow rule name

AD ILM Advanced Attribute flow

Эго мы будем использовать в ADExtension.dll которую мы укажем в Configure Extension

AD ILM Conf Ext

В АDExtension.dl используется только одна процедура MapAttributesForImport

Public Sub MapAttributesForImport(ByVal FlowRuleName As String, ByVal csentry As CSEntry, ByVal mventry As MVEntry) Implements IMASynchronization.MapAttributesForImport

' TODO: write your import attribute flow code

Const ADS_UF_ACCOUNTDISABLE As Integer = &H2 'Disable user account

Const ADS_UF_NORMAL_ACCOUNT As Integer = &H200 'Typical user account

Select Case FlowRuleName

Case "msDS-UserAccountDisabled"

mventry("msDS-UserAccountDisabled").BooleanValue = (csentry("userAccountControl").IntegerValue And ADS_UF_ACCOUNTDISABLE) = ADS_UF_ACCOUNTDISABLE

End Select

End Sub

Настройка МА для eDir аналогична AD вот только не нужно в Configure Extension указывать DLL а указать что нужно синхронизировать пароли

и вот мой Confugure Attribute Flow

eDir Conf Att

Только не забываем использовать SSL протокол для подключения к LDAP, о настройке подключения по протоколу SSL в NetWare можно посмотреть тут

И теперь чтобы все это заработало нужно в скомпелить MVExtension.dll и прописать в Options
ILM Options

И сам код MVExtension.dl:

Imports Microsoft.MetadirectoryServices

Imports System

Imports System.Text

Imports System.IO

Imports ActiveDs.ADS_USER_FLAG

Public Class MVExtensionObject

Implements IMVSynchronization

Public Sub Initialize() Implements IMVSynchronization.Initialize

' TODO: Add initialization code here

End Sub

Public Sub Terminate() Implements IMVSynchronization.Terminate

' TODO: Add termination code here

End Sub

Private Sub SetNovellPW(ByRef csentry As CSEntry, ByVal pw As String)

' TODO: Setting an Initial Password in eDirectory

Dim password() As Byte

password = New System.Text.UTF8Encoding(False, False).GetBytes(pw)

ReDim Preserve password(UBound(password) + 2)

csentry("userPassword").Values.Add(password)

End Sub

Public Sub Provision(ByVal mventry As MVEntry) Implements IMVSynchronization.Provision

Dim adMA As ConnectedMA

Dim csentry As CSEntry

Dim dn As ReferenceValue

Dim ExceptionMessage As String

Const eDir_OU = "ou=Account, o=TREE_eDir"

Const eDir_MA = "MA_Novell"

Const AD_MA = "MA_Active_Directory"

Const ACTIVE_OU_AD = "OU=Account,OU=Branch,DC=XXXXX,DC=XXXXXXX"

Const INACTIVE_OU_AD = "OU=Disabled,OU=Account,OU=Branch, DC=XXXXX,DC=XXXXXXX "

Const INACTIVE_OU_ED = "ou=Disabled,ou=Account,o=TREE_eDir"

Dim Connectors As Integer

Dim Container As String

If Not mventry("cn").IsPresent Then

ExceptionMessage = "The attribute cn was unexpectedly not present on the metaverse object."

Throw New UnexpectedDataException(ExceptionMessage)

Exit Sub

End If

' +++++++++++ eDirectory ++++++++++++++++

adMA = mventry.ConnectedMAs(eDir_MA)

Container = eDir_OU

Connectors = adMA.Connectors.Count

dn = adMA.EscapeDNComponent("cn=" + mventry("cn").Value).Concat(Container)

If 0 = Connectors Then

Select Case mventry.ObjectType.ToLower()

Case "group"

csentry = adMA.Connectors.StartNewConnector("groupOfNames")

csentry.DN = dn

csentry.CommitNewConnector()

Case "person"

csentry = adMA.Connectors.StartNewConnector("inetOrgPerson")

csentry.DN = dn

csentry("groupMembership").Values.Add("cn=Everyone,ou=Account,o=TREE_eDir")

csentry("securityEquals").Values.Add("cn=Everyone,ou=Account,o=TREE_Edir")

SetNovellPW(csentry, "1Q2w3e4r5")

csentry.CommitNewConnector()

End Select

ElseIf 1 = Connectors Then

csentry = adMA.Connectors.ByIndex(0)

If csentry.DN.ToString.ToLower <> dn.ToString.ToLower Then

csentry.DN = dn

End If

Else

Throw New UnexpectedDataException("multiple connectors:" + Connectors.ToString)

End If

' +++++++++++ Active Directory ++++++++++++++++

adMA = mventry.ConnectedMAs(AD_MA)

If (mventry.ObjectType = "person") Then

If mventry("msDS-UserAccountDisabled").BooleanValue Then

Container = INACTIVE_OU_AD

dn = adMA.EscapeDNComponent("cn=" + mventry("displayName").Value).Concat(Container)

If adMA.Connectors.Count = 1 Then

'''Check if rename needed

csentry = adMA.Connectors.ByIndex(0)

If csentry.DN.ToString.ToLower <> dn.ToString.ToLower Then

csentry.DN = dn

End If

End If

End If

End If

End Sub

Public Function ShouldDeleteFromMV(ByVal csentry As CSEntry, ByVal mventry As MVEntry) As Boolean Implements IMVSynchronization.ShouldDeleteFromMV

Throw New EntryPointNotImplementedException()

End Function

End Class



Комментариев нет:

Отправить комментарий