Active Directory & .Net 2.0


précédentsommairesuivant
existe déjà

5. Gestion d'Active Directory

Nous venons de voir ce qui concerne spécifiquement la gestion des objets de l'annuaire comme les comptes utilisateurs, tout cela était à peu prés existant dans le Framework .Net 1.1, à quelques évolutions prés. Cette nouvelle partie va maintenant concerner la nouveauté en la matière: je veux bien évidemment parler du namespace System.DirectoryServices.ActiveDirectory. Comme son nom ne l'indique absolument pas ( lol ) ce namespace a été spécifiquement développé pour Microsoft Active Directory à la différence de System.DirectoryServices qui est un namespace supportant tous les annuaires conforme à LDAP 3.0. Ce namespace est entièrement nouveau, et fait son apparition dans la désormais célèbre version 2.0 du Framework .Net, il va grandement faciliter le développement d'applications de gestion d'infrastructure Active Directory, mais plutôt que d'en parler voyons de quoi il est capable, concrètement, dans le code.

5.1. Les domaines et la forêt

5.1.1. Définition des concepts de domaines et de forêt

Un domaine est une entité logique de sécurité délimitée dans le cadre d'un réseau pouvant être situé sur plusieurs sites physiques. Il regroupe un ensemble de ressources qui seront administrées de manière centralisée par le biais des contrôleurs de domaine. Le domaine Active Directory (différent du domaine Windows NT) est basé sur le protocole DNS, ainsi un domaine sera délimité par un nom DNS commun, par exemple "mondomaine.local"; si l'on continue avec cet exemple un serveur nommé serveur01 aura un nom DNS serveur01.mondomaine.local, et cela est de même pour chaque ressource.

Une forêt est un ensemble de domaines qui sont regroupés eux-mêmes en arbres avec des noms DNS contigus, il s'agît de la plus grande entité de l'infrastructure Active Directory, depuis Windows Server 2003, il est possible d'établir des relations d'approbations entre des forêts, ce qui repousse un peu plus encore la taille maximale de votre Active Directory. Une forêt est donc une entité administrative qui est composée de domaines qui peuvent être regroupés en arbres.

5.1.2. Les contrôleurs de domaine

L'administration des domaines Active Directory est donc centralisée et se réalise grâce aux contrôleurs de domaines. Il doit donc en avoir au minimum un par domaine, s'il y en a plusieurs alors ils se répartissent les rôles FSMO et organisent la réplication de l'annuaire sur chacun d'eux pour en avoir une copie synchronisée. Nous allons voir ici comment lister l'ensemble des contrôleurs de domaines, le nouveau namespace : System.DirectoryServices.ActiveDirectory nous facilite grandement la tâche, seules quelques lignes de code sont nécessaires à cette opération.

Lister les contrôleurs de domaine
Sélectionnez

    Public Function getListeDC() As DomainControllerCollection

        Dim listeDC As DomainControllerCollection = Nothing

        ' Définition du context de connexion : connexipn au domaine courant
        Dim monContext As New DirectoryContext(DirectoryContextType.Domain, _
		                      Domain.GetCurrentDomain.ToString)

        Dim monDomaine As Domain = Domain.GetDomain(monContext)

        Try

            ' Récupération de la liste des contrôleurs de domaine
            listeDC = monDomaine.FindAllDomainControllers()

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return listeDC

    End Function

Remarque : j'ai constaté un bug qui se produisait avec les versions Fr de Windows Server 2003 lors de l'utilisation de l'objet DirectoryContext, en effet à chaque instanciation de cet objet une exception était levée pour une propriété dnsHostName non renseignée. Aucun problème particulier n'a, par contre, était constaté avec les versions US de Windows Server 2003. Gageons que ce problème ne sera plus présent dans les versions finales ! En effet, cet article à entièrement été réalisé avec Visual Studio 2005 Beta 2 et le Framework .Net 2.0 également en version beta 2.

5.1.3. Informations sur la forêt

Voyons maintenant comment récupérer des informations sur la forêt Active Directory courante. Je me contenterai du seul code commenté tant ces opérations ne présentent aucune difficulté !

  • Nom de la forêt :
Récupérer le nom de la forêt :
Sélectionnez

    Public Function getNomForet() As String

        ' Définition d'une variable forêt
        Dim maForet As Forest = Nothing

        Try

            ' Récupération de la forêt courante
            maForet = Forest.GetCurrentForest

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return maForet.ToString

    End Function
  • Liste des domaines de la forêt :
Lister les domaines de la forêt :
Sélectionnez

    Public Function getDomainesForet() As DomainCollection

        ' Collection qui contiendra la liste des domaine
        Dim mesDomaines As DomainCollection = Nothing

        Try

            ' Récupération de la liste des domaines de la forêt courante
            mesDomaines = Forest.GetCurrentForest.Domains

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return mesDomaines

    End Function
  • Niveau fonctionnel de la forêt :

Le niveau fonctionnel de la forêt correspond (pour faire très simple) au niveau de fonctionnalité qu'autorise la fôret. Ainsi, en fonction de la présence dans votre fôret de contrôleurs de domaines fonctionnant sous Windows NT, 2000 Server ou Server 2003, vous n'aurez pas accès aux mêmes fonctionnalités, tout cela évidemment pour des raisons de compatibilités et en définitive de permettre la cohabitation de contrôleurs de domaines tournant avec des versions différentes de Windows. Par défaut, une fôret à un niveau fonctionnel "Windows 2000". Je vous propose ici de détecter grâce à ce code quel est le niveau fonctionnel actuel de votre forêt.

Trouver le niveau fonctionnel de la forêt :
Sélectionnez

    Public Function getNiveauForet() As ForestMode

        Dim monMode As ForestMode = Nothing

        Try
            ' Récupération du niveau fonctionnel de la forêt
            monMode = Forest.GetCurrentForest.ForestMode

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return monMode

    End Function

5.1.4. Niveau fonctionnel du domaine

Un domaine, au même titre qu'une fôret, possède un niveau fonctionnel, il en existe plusieurs qui déterminent chacun des niveaux de fonctionnalités différents, vous pouvez si vous le désirez augmenter le niveau fonctionnel d'un domaine si vous souhaitez disposer de fonctionnalités et d'une sécurité encore plus avancées, mais cela impose également quelques contraintes. Le code que je vous propose ici, vous permet de détecter le niveau fonctionnel d'un domaine.

Trouver le niveau fonctionnel du domaine :
Sélectionnez

    Public Function getNiveauDomaine() As DomainMode

        ' Connexion au domaine courant
        Dim monContext As New DirectoryContext(DirectoryContextType.Domain, _
		                      Domain.GetCurrentDomain.ToString)

        Dim monDomaine As Domain = Domain.GetDomain(monContext)
        Dim modeDomaine As DomainMode

        Try

            ' Récupération du niveau du domaine
            modeDomaine = monDomaine.DomainMode

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return modeDomaine

    End Function

Passons maintenant au processus de réplication, processus capital d'Active Directory.

5.1.5. Gestion de la réplication

La réplication, est le processus vital au fonctionnement d'une infrastructure Active Directory. Pour simplifier, c'est grâce à la réplication que nous pouvons avoir une copie identique et synchronisée de l'annuaire sur l'ensemble du domaine. Ce processus est d'une trés grande complexité et, selon moi, peut être ce qu'il y a de plus sensible à gérer dans Active Directory. Malgré cette grande complexité, le nouveau namespace du Framework .Net 2.0 nous permet de gérer en partie ce processus. Voyons immédiatement un exemple vous permettant de récupérer la liste des actions de réplications n'ayant pas pu être effectuées :

Actions de réplications non réalisées :
Sélectionnez

    Public Function operationsReplicationNonEffectuees(ByVal nomDC As String) _ 
	                                     As ReplicationOperationCollection
        ' nomDC : nom DNS d'un contrôleur de domaine

        Dim listeOperations As ReplicationOperationCollection = Nothing

        Try

            ' Connexion au contrôleur de domaine spécifié en paramètre
            Dim monContext As New DirectoryContext(DirectoryContextType.DirectoryServer, nomDC)
            Dim monDC As DomainController = DomainController.GetDomainController(monContext)
            ' Récupération des opérations de réplication non effectuées
            listeOperations = monDC.GetReplicationOperationInformation.PendingOperations()

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return listeOperations

    End Function

Voyons maintenant une opération encore plus intéressante pour les administrateurs, initier la réplication d'une partition donnée d'un contrôleur de domaine vers un autre :

initier la réplication d'une partition :
Sélectionnez

    Public Function initierReplication(ByVal nomDCorigine As String, _
                                       ByVal nomDCdestination As String, _
                                       ByVal partitionArepliquer As String) As Boolean

        ' nomDCorigine : nom DNS contrôleur de domaine de 
        '       contenant la partition à répliquer
        ' nomDCdestination : nom DNS du contrôleur de domaine 
        '       la partition doit être répliquée
        ' partitionArepliquer : nom distingué de la partition
        '      à répliquer

        Try

            Dim monContext As New DirectoryContext(DirectoryContextType.DirectoryServer, nomDCdestination)
            Dim monDC As DomainController = DomainController.GetDomainController(monContext)
            ' Initiation de la réplication
            monDC.SyncReplicaFromServer(partitionArepliquer, nomDCorigine)

            Return True

        Catch ex As Exception

            MessageBox.Show(ex.Message)
            Return False

        End Try

    End Function

5.2. Gestion des "Organizational Units" ou OU

Les Unités d'Organisation (pour "Organizational Units" (OU)) sont en fait des conteneurs que l'on utilise pour y placer des objets comptes d'utilisateurs, des comptes d'ordinateurs, des groupes, ou encore tout autres types de ressources... C'est sur eux que repose en très grande partie le déploiement des stratégies de groupe, pierre angulaire de l'administration centralisée d'Active Directory.

5.2.1. Lister les OU dans un annuaire

Les OU sont gérées depuis la console "Ordinateurs et utilisateurs Active Directory", vous pouvez par le biais de celle-ci réaliser un trés grand nombre d'opérations, voyons ici un exemple commenté en détail qui vous montre comment lister l'ensemble des OU contenues dans l'annuaire.

Lister les Organizational Units (OU) :
Sélectionnez

    Public Function listerOU(ByVal monCheminLdapRecherche As String, _
	                         ByVal monUsername As String, _
	                         ByVal monPassword As String) As ArrayList

        ' ArrayList qui va contenir le résultat retourné par la recherche
        Dim maListeOU As New ArrayList

        Try


            ' Définition de l'emplacement de recherche
            Dim monEmplacementRecherche As New DirectoryEntry("LDAP://" & _
			    monCheminLdapRecherche, monUsername, monPassword, AuthenticationTypes.Secure)

            ' Instanciation d'un objet DirectorySearcher
            Dim maRecherche As New DirectorySearcher(monEmplacementRecherche)

            ' dureeMax initisalisée à 45 secondes
            ' Il s'agît de la durée maximale que prendra la requête
            Dim dureeMax As New TimeSpan(0, 0, 45)

            ' Emplacement  la recherche doit être effectuée 
            ' dans la hierarchie Active Directory
            maRecherche.SearchRoot = monEmplacementRecherche

            ' Définition du Scope de la recherche, ici le conteneur 
            ' seulement et tous ses "sous conteneur"
            maRecherche.SearchScope = SearchScope.Subtree

            ' Filtre uniquement les objets de type "organizationalUnit"
            maRecherche.Filter = "(objectClass=organizationalUnit)"

            ' Détermination de la propriété à récupérer lors de la recherche
            maRecherche.PropertiesToLoad.Add("name")

            ' Durée maximum de la recherche
            maRecherche.ServerTimeLimit = dureeMax

            ' Fixe le nombre maximum d'objets retournés
            maRecherche.SizeLimit = 1500

            Dim uneOU As DirectoryServices.SearchResult

            ' Récupération du 'sAMAccountName' des utilisateurs récupérés
            For Each uneOU In maRecherche.FindAll()
                maListeOU.Add(uneOU.GetDirectoryEntry.Properties.Item("name").Value.ToString)
                MessageBox.Show((uneOU.GetDirectoryEntry.Properties.Item("name").Value.ToString))
            Next

            monEmplacementRecherche.Close()

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        Return maListeOU

    End Function

Vous voyez qu'il s'agît d'une simple requête réalisée grâce au DirectorySearcher, j'ai volontairement utilisé un grand nombre d'option pour vous montrer que si l'utilisation de cet objet peut être basique, il est également possible de réaliser des recherches précises sous de nombreuses conditions.

5.2.2. Créer des OU dans un annuaire

Voici maintenant un exemple commenté qui vous montre comment créer des unités d'organisation dans Active Directory :

Créer des Organizational Units (OU) :
Sélectionnez

    Public Function createOU(ByVal monCheminLdap As String, _
	                         ByVal monUsername As String, _
	                         ByVal monPassword As String, _
	                         ByVal nouvelleOU As String) As Boolean
	                         
        Try

            ' Connexion au noeud de l'annuaire  va être ajoutée l'OU
            Dim monEmplacement As DirectoryEntry = New DirectoryEntry("LDAP://" & _
			    monCheminLdap, monUsername, monPassword, AuthenticationTypes.Secure)
			    
            ' Ajout de l'OU
            Dim monOU As DirectoryEntry = monEmplacement.Children.Add("OU=" & nouvelleOU, _
			                                             "organizationalUnit")

            ' Validation des modifications
            monOU.CommitChanges()

            Return True

        Catch ex As Exception

            MessageBox.Show(ex.Message)
            Return False

        End Try

    End Function

5.3. Gestion des rôles FSMO

5.3.1. Définition des rôles FSMO

Les rôles de maîtres d'opératiion ou FSMO (Flexible Single Master Operation) correspondent à un certain nombre de rôles qui sont pris en charge par un seul et unique contôleur de domaine au sein d'un domaine ou d'une forêt, et cela, en fonction du rôle concerné. Je n'entrerai pas dans les détails, mais sachez que le but principal de la définition des rôles déténus par des contrôleurs de domaine uniques à pour objet la protection du schéma de l'annuaire et d'assurer en quelque sorte l'intégrité référencielle d'Active Directory. Voici la liste des 5 rôles FSMO que l'on trouve dans un environnement Active Directory sous Windows Server 2003.

Rôle FSMO Présentation du rôle
Contrôleur de schéma C'est lui qui gère et réalise toutes les modifications du schéma Active Directory, il n'en existe qu'un seul dans la fôret.
Maître d'attribution de noms de domaine Il gère l'ajout et la suppression de domaines dans la fôret, il n'en existe qu'un seul dans la fôret.
Maître RID Son rôle est d'allouer des séquences de RID (ID Relatifs) aux contrôleurs de domaine de son domaine, il en existe un par domaine.
Maître d'émulateur PDC Il émule un contrôleur principal de domaine (PDC) pour les serveurs et clients qui exécutent une version de Windows antérieure à Windows 2000, on en trouve un par domaine de la fôret.
Maître d'infrastructure Il est le garant de la cohérence des références des objets de son domaine sur les objets des autres domaines, il est une pierre angulaire du fonctionnement d'Active Directory sur des infrastructures à domaines multiples, il en existe un pour chaque domaine de la fôret.

5.3.2. Localisation des rôles

On l'a bien compris, les rôles FSMO s'exécutent au mieux sur un conrôleur de domaine par domaine ou même par fôret suivant le rôle concerné, ces contrôleurs de domaine ont donc une importance stratégique pour le fonctionnement de votre infrastructure Active Directory, c'est pourquoi il est utile de pouvoir localiser quel serveur est titulaire de chacun de ces rôles. Je vous propose donc un petit morceau de code qui vous permettra d'indentifier quel contrôleur de domaine est titulaire de quel rôle.

Localiser les rôles FSMO dans une forêt et un domaine :
Sélectionnez

    Public Function getListeRolesDC() As ArrayList

        Dim maListeRoles As New ArrayList
        Dim monDomaine As Domain = Domain.GetCurrentDomain

        Dim maitreInfrastructure As String = Nothing
        Dim maitreRID As String = Nothing
        Dim emulateurPDC As String = Nothing
        Dim maitreAttributionNoms As String = Nothing
        Dim controleurSchema As String = Nothing

        Try

            ' Maître d'infrastructure
            maitreInfrastructure = monDomaine.InfrastructureRoleOwner.ToString
            maListeRoles.Add("Maître d'infrastructure : " & maitreInfrastructure)

            ' Maître  RID
            maitreRID = monDomaine.RidRoleOwner.ToString
            maListeRoles.Add("Maître  RID : " & maitreRID)

            ' Emulateur PDC
            emulateurPDC = monDomaine.PdcRoleOwner.ToString
            maListeRoles.Add("Emulateur PDC : " & emulateurPDC)

            ' Maître d'attribution de noms de domaine 
            maitreAttributionNoms = monDomaine.Forest.NamingRoleOwner.ToString
            maListeRoles.Add("Maître d'attribution de noms de domaine : " & maitreAttributionNoms)

            ' Contrôleur de schéma
            controleurSchema = monDomaine.Forest.SchemaRoleOwner.ToString
            maListeRoles.Add("Contrôleur de schéma : " & controleurSchema)

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return maListeRoles

    End Function

5.3.3. Transfert des rôles

Les rôles FSMO sont attribués à des contrôleurs de domaine précis, mais il est possible de transférer ces rôles d'un contrôleur à un autre. Voici un exemple vous montrant comment réaliser une telle opération.

Transférer un rôle FSMO :
Sélectionnez

    Private Function TransfertRoleFSMO(ByVal roleAtransferer As ActiveDirectoryRole, _
	                                   ByVal nomDCdestinationRole As String) As Boolean

        Try

            Dim monContext As New DirectoryContext(DirectoryContextType.DirectoryServer, _
			                                       nomDCdestinationRole)
			                                       
            Dim monDC As DomainController = DomainController.GetDomainController(monContext)
            ' Transfert du rôle vers le contrôleur choisi
            monDC.TransferRoleOwnership(roleAtransferer)

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

    End Function

5.4. Gestion des sites

5.4.1. Définition du concept de site dans Active Directory

Dans Active Directory, les sites vous permettent de prendre en compte la topologie de votre réseau. Les sites représentent la structure physique de votre réseau, ils sont donc différents des domaines qui eux représentent la structure logique. La prise en charge de sites est une fonctionnalité indispensable pour toute infrastructure Active Directory ayant une localisation géorgraphique éclatée, dont les différents sites sont liés par des connexions WAN. La gestion de sites dans Active Directory permet d'optimiser la réplication, les opération de maintenance et d'administration, les échanges et les flux de données entre les sites et cela à l'echelle des domaines et de la forêt. Un site est donc une réprésentation physique de votre réseau, qui est indépendante de l'organisation et du découpage des différents domaines.

5.4.2. Informations sur les sites existants

Il peut être utile dans une vision administrative de récupérer un certain nombre d'informations à propos des sites de votre infrastructure Active Directory, voici comment récupérer par exemple la liste des sites existants dans l'annuaire.

Lister les sites présents dans une fôret Actvive Directory :
Sélectionnez

    Public Function getListeSitesDomaines() As ReadOnlySiteCollection

        Dim listeSites As ReadOnlySiteCollection = Nothing
        ' Connexion à la forêt courante
        Dim monContext As New DirectoryContext(DirectoryContextType.Forest, _
		                      Forest.GetCurrentForest.ToString)
		                      
        Dim maForet As Forest = Forest.GetForest(monContext)

        Try

            ' Récupération de la liste des sites
            listeSites = maForet.Sites

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return listeSites

    End Function

5.4.3. Créer un site

Voici un exemple commenté vous montrant comment créer un nouveau site.

Créer un site dans l'Active Directory :
Sélectionnez

    Public Function creationSite(ByVal nomSite As String) As Boolean

        Try

            Dim monContext As New DirectoryContext(DirectoryContextType.Forest, _
			                      Forest.GetCurrentForest.ToString)

            Dim monSite As ActiveDirectorySite
            ' Création du nouveau site dans l'annuaire
            monSite = New ActiveDirectorySite(monContext, nomSite)
            ' Validation des modifications
            monSite.Save()

            Return True

        Catch ex As Exception

            MessageBox.Show(ex.Message)
            Return False

        End Try

    End Function

précédentsommairesuivant
existe déjà

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2005 Ronald VASSEUR. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.