IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Bouger des objects AD d'une OU à une autre


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Par défaut Bouger des objects AD d'une OU à une autre
    Bonjour,

    Lors d'une migration Windows 7, j'ai besoin de bouger mes ordinateurs dans une OU spéciale afin de lancer un décryptage du disque.

    J'ai actuellement deux outils qui me permettent de faire la jonction au domaine et d'ajouter des objects (ordinateur, utilisateur ou groupe) dans des groupes AD qui sont codés en VB.net.

    Je voudrai faire un outil qui soit capable de bouger un ordinateur d'une OU à une autre.

    J'ai déjà essayé pas mal de combinaisons mais sans succès ... Dire que ça ne fonctionne pas n'est pas exacte, cela fonctionne à condition que je face "Exécuter avec un autre compte ..." mon exécutable et que je rendre les informations du compte qui a les droits en question. Ce que je souhaiterai c'est simplement avoir à le lancer et mettre l'ID et le mot de passe directement dans mon code.

    Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Il faudrait à ce stade :

    - nous montrer le contenu de ton code (en prenant soin de virer les "ids de connexion" ?
    - savoir si tu exécutes ton programme depuis un compte membre du groupe "Administrateurs de domaine" ?
    - ton projet est-il compilé avec un paramétrage du ".Manifest" cohérent ?
    - Exécutes-tu ton programme depuis le serveur où se situe l'AD directement ?

    A+

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Par défaut
    Bonsoir,

    Merci de ta réponse

    - nous montrer le contenu de ton code (en prenant soin de virer les "ids de connexion" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim NewUser As New DirectoryEntry("LDAP://CN=COMPUTER-TEST,OU=Test,workstations,DC=eu,DC=test,DC=corp")
    NewUser.MoveTo(New DirectoryEntry("LDAP://OU=workstations,DC=eu,DC=test,DC=corp")
    NewUser.CommitChanges()
    - savoir si tu exécutes ton programme depuis un compte membre du groupe "Administrateurs de domaine" ?
    Le compte avec je le lance est oui bien Admin du domaine (quand je fais clic droit éxécuter en tant que ...).

    - ton projet est-il compilé avec un paramétrage du ".Manifest" cohérent ?
    Je ne vois pas de quoi tu parles , si tu peux m'aider ? :/

    - Exécutes-tu ton programme depuis le serveur où se situe l'AD directement ?
    Non, depuis le poste client lui même (COMPUTER-TEST) qui est dans le domaine.

    Merci.

  4. #4
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Il faut procéder par étape :

    1. Se connecter au domaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim LdapConnect As New DirectoryEntry("LDAP://DOMAIN_NAME","DOMAIN_USERNAME", "DOMAINUSERNAME_PWD")
    2. Cibler l'OU de ton objet computer à l'aide le la propriété. Path :

    LdapConnect.Path = "LDAP://OU=Test,workstations,DC=eu,DC=test,DC=corp"

    3. Énumérer les objets de L'OU pour extraire le nom de ton objet de type Ordinateur (COMPUTER-TEST) à l'aide de la classe DirectorySearcher

    4. Cibler en parallèle le futur nouvel emplacement

    5. Utiliser la méthode. MoveTo

    Voilà très sommairement.

    NB : Pour se connecter au domaine il y a aussi la possibilité de renseigner un fichier app.config au sein de ton projet et renseigner :
    Nom de domaine
    Nom du compte admin domaine
    Mot de passe admin domaine

    Ceci dit j'espère que tu es connectés au PC avec un compte membre du groupe administrateurs du domaine.

    Pour le paramétrage du fichier manifest en requireadministrator cherche sur Google :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    A+

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Par défaut
    Bonsoir,

    Le but serait de manager le nom d'utilisateur et le mot de passe en passant par des arguments, de manière à ne pas avoir à toucher à mon projet par la suite et tout gérer grâce aux arguments

    J'avoue que j'ai un peu de mal à comprendre.

    Plus bas j'ai une fonction qui me sert à tester sur une OU existe ou pas. Voici le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Dim Ldap As DirectoryEntry = New DirectoryEntry("LDAP://" & DomainName.ToUpper, DomainUserName, DomainUserPassword)
    Dim searcher As DirectorySearcher = New DirectorySearcher(Ldap)
    searcher.Filter = "(objectClass=organizationalUnit)"
     
    Dim DirEntry As DirectoryEntry
     
    Do
        For Each results As SearchResult In searcher.FindAll
            DirEntry = results.GetDirectoryEntry
     
            If DomainOUsDCs.ToUpper = DirEntry.Path.ToUpper().Replace("LDAP://" & DomainName.ToUpper & "/", "") Then
                OUsDCsExists = True
                Exit Do
            Else
                OUsDCsExists = False
            End If
        Next
     
    Loop While False
    Cela fonctionne et je n'ai pas de problème pour faire ma recherche. Sauf que quand j'utilise la même méthode et bien cela ne fonctionne pas quand je veux bouger mon objet

    J'ai essayé, beaucoup, beaucoup de combinaisons et je n'arrive à rien

    Merci.

  6. #6
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Programmer ce n'est pas : essayer un maximum de combinaisons en croyant que ça marchera un jour......

    Brefff.....

    Lorsque tu instancies un objet DirectoryEntry avec l'authentification au domaine alors cette instance doit être réutilisée pour toutes les autres manipulations dans l'annuaire Active Directory !

    Le plus simple serait de créer une classe dans laquelle tu instancies une seule fois la connexion à l'AD (qui te retournes un objet de type DirectoryEntry) et ensuite tu le réutilises pour déterminer l'emplacement de destination et enfin la méthode MoveTo.

    Un exemple de classe de gestion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    Imports System.DirectoryServices
     
    Public Class AD
        Implements IDisposable
     
        'Des propriétés publiques qui pouront être utiles en dehors de la classe
        Public Property DomainName As String
        Public Property DomainUserName As String
        Public Property DomainUserPassword As String
     
        'Déclaration d'une variable de portée de classe : sera réutilisée dans la classe après instanciation dans le constructeur
        Private m_DirEntry As DirectoryEntry = Nothing
     
        Public Sub New(lDomainName As String, lDomainUserName As String, lDomainUserPassword As String)
            DomainName = lDomainName
            DomainUserName = lDomainUserName
            DomainUserPassword = lDomainUserPassword
            ConnectTo()
        End Sub
     
        Private Sub ConnectTo()
            'm_DirEntry est l'instance de connexion à l'annuaire
            m_DirEntry = New DirectoryEntry("LDAP://" & _DomainName, _DomainUserName, _DomainUserPassword)
        End Sub
     
        Public Sub MoveComputerIntoOU(ComputerName As String, OuDestinationPath As String)
            Try
                'On parcours tous les objet de type 'Computer' à la recherche du nom : COMPUTER-TEST
                Using sSearcher = New DirectorySearcher(m_DirEntry, "(&(objectCategory=computer)(cn=" & ComputerName & "))")
     
                    'Je cherche une seule occurence 
                    Dim sResult = sSearcher.FindOne
     
                    If Not sResult Is Nothing Then
                        'Je parcours toutes les OU de l'annuaire : attention à la notion de parent et d'enfant dans les OU 
                        'Un nom d'OU peut être le même au sein d'une autre arborescence
                        Using dSearcher = New DirectorySearcher(m_DirEntry, "(objectCategory=organizationalUnit)")
                            'Je cherche toutes les occurences
                            Dim dResult = dSearcher.FindAll
     
                            If Not dResult Is Nothing Then
                                For Each result In dResult
                                    'J'affine la cible du chemin recherché
                                    If result.GetDirectoryEntry.Path.ToUpper.startswith(("LDAP://" & _DomainName & "/" & OuDestinationPath).ToUpper) Then
                                        'On vérifie que l'OU source n'est pas identique à l'OU destination
                                        If Not (sResult.GetDirectoryEntry.Path.ToUpper = ("LDAP://" & _DomainName & "/cn=" & ComputerName & "," & OuDestinationPath).ToUpper) Then
                                            Dim sLocation = sResult.GetDirectoryEntry
                                            Dim dLocation = result.GetDirectoryEntry
                                            Dim newName = sLocation.Name
                                            sLocation.MoveTo(dLocation, newName)                              
                                        End If
                                    End If
                                Next
                            End If
                        End Using
                    End If
                End Using
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
     
    #Region "IDisposable Support"
        Private disposedValue As Boolean
     
        Protected Overridable Sub Dispose(disposing As Boolean)
            If Not disposedValue Then
                If disposing Then
                    m_DirEntry.Close()
                    m_DirEntry.Dispose()
                End If
            End If
            disposedValue = True
        End Sub
     
        Public Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
        End Sub
    #End Region
     
    End Class
    Dans un Form (pour l'exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Public Class Form1
     
        Private m_AD As AD = Nothing
     
        Public Sub New()
            InitializeComponent()
            m_AD = New AD("groupe3.fr", "Administrateur", "Azerty63")
        End Sub
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'L'ordinateur : COMPUTER-TEST
            'Je veux le déplacer dans : OU=Test,OU=ComputersOU,DC=groupe3,DC=fr
            m_AD.MoveComputerIntoOU("COMPUTER-TEST", "OU=Test,OU=ComputersOU,DC=groupe3,DC=fr")
        End Sub
    End Class
    Si tu veux rajouter des méthodes c'est dans la classe que ca se passe et il faut réutiliser l'instance de connexion à l'AD.

    Et surtout si tu veux des explications sur le contenu, je suis prêt à t'expliquer donc n'hésites pas car programmer c'est finalement : bien aborder une problématique

    A+

Discussions similaires

  1. Bouger des sous-matrices dans une matrice
    Par DJEcalcul dans le forum MATLAB
    Réponses: 4
    Dernier message: 16/03/2012, 17h31
  2. Réponses: 5
    Dernier message: 25/05/2007, 15h20
  3. [VBA-E] extraire des données à partir d'une autre feuille
    Par zzman dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/01/2007, 13h26
  4. Réponses: 5
    Dernier message: 12/12/2006, 16h24
  5. Réponses: 2
    Dernier message: 05/06/2006, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo