ILM 2007 синхронизация пользователей AD и eDirectory
26 февраля 2009 г.Настраиваем MA (Management Agent) для Active Directory:
- Properties - Тут все понятно….
- Connect to AD Forest - комментарии лишние
- Configure Dir Partitions – В Containers выберем контейнеры с пользователями которые мы собираемся синхронизировать. В Password Synch отмечаем Enable this partition as a password synch. если мы собираемся синхронизировать пароли и в Targets выберем МА NetWare когда его создадим. (о настройке синхронизации паролей можно прочитать на TechNet)
- Select Object Types – Выберем нужные типы объектов
- Select Attributes – Отмечаем нужные атрибуты
- Confugure Connector Filter – нам пока не нужен
- Configure Join and Projection Rules
- Confugure Attribute Flow – Настройка соответствия атрибутов которые мы хотим импортировать и экспортировать из AD в Metaverse
Тут стоит обратить внимание на AD атрибут UserAccountControl, дело в то что он принимает значения, а в eDirectory атрибут loginDisabled, который отвечает за то включена или отключена учетная запись, принимает значения “True” или “False”. Что бы все корректно работало и состояние учетной записи пользователя (откл. или вкл.) синхронизировало между AD и eDir, делаем следующие:
- Создаем атрибут Boolean в Metaverse Desinger например msDS-UserAccountDisabled
- Указываем UserAccountControl импортировать в msDS-UserAccountDisabled, но при этом Mapping Type укажем Advanced и укажем Flow rule name
Эго мы будем использовать в ADExtension.dll которую мы укажем в Configure Extension
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
Только не забываем использовать SSL протокол для подключения к LDAP, о настройке подключения по протоколу SSL в NetWare можно посмотреть тут
И теперь чтобы все это заработало нужно в скомпелить MVExtension.dll и прописать в 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=
Const INACTIVE_OU_AD = "OU=Disabled,OU=Account,OU=Branch, DC=
Const INACTIVE_OU_ED = "ou=Disabled,ou=Account,o=TREE_eDir"
Dim Connectors As Integer
Dim Container As String
If Not mventry("cn").IsPresent ThenExceptionMessage = "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