Partage
  • Partager sur Facebook
  • Partager sur Twitter

Doublon dans listView

    3 novembre 2022 à 16:25:52

    Bonjour,

    j'essai d'afficher dans un listView tous les utilisateurs faisant partie d'un groupe nommé groupe1 et de ce groupe1 lister tous les groupes auquel chaque utilisateurs fait partie. Le problème lorsque j’essaie de lister cela dans un listView qui comporte 4 colonnes Users, Mail, Groupe_user1, Groupe_user1, plusieurs doublon sont afficher.

    pouvez-vous m'aider à résoudre ce problème, Voici mon code :

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            BackgroundWorker1.RunWorkerAsync()
        End Sub
    
        Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    
            Try
    
                ListADGroupMembers()
    
            Catch
    
            End Try
        End Sub
    
    
        Public Sub ListADGroupMembers()
    
            Dim DirectoryRoot As New DirectoryEntry("LDAP://" & Environment.UserDomainName) 'Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName)
            Dim DNC = "LDAP://" & Environment.UserDomainName
            Dim GroupName As String = "groupe1"
            Dim GroupMembers As Specialized.StringCollection = GetGroupMembers(DNC, GroupName)
    
            For Each Member As String In GroupMembers
                Dim ctx As New PrincipalContext(ContextType.Domain)
                Dim ADuser As UserPrincipal = UserPrincipal.FindByIdentity(ctx, Member) ' find a user
    
                Dim userDN
                userDN = ADuser.DistinguishedName
    
                Dim ADEntry As New DirectoryEntry("LDAP://" & Environment.UserDomainName)
                Dim mySearcher As DirectorySearcher = New DirectorySearcher(ADEntry)
    
    
                mySearcher.Filter = "(&(ObjectClass=User)(distinguishedName=" & userDN & "))"
                mySearcher.PropertiesToLoad.Add("MemberOf")
    
                Dim searchResults As SearchResultCollection = mySearcher.FindAll()
                If searchResults.Count = 0 Then
                    Invoke(New MethodInvoker(Sub() MessageBox.Show("L'utilisateur n'existe pas !")))
                End If
    
                If searchResults.Count > 0 Then
                    Dim group As New DirectoryEntry(searchResults(0).Path)
                    For Each Info As Object In group.Properties("MemberOf")
                        Dim Split1 = Split(Info, ",")
                        Dim Split2 = Split(Split1(0), "=")
                        Dim GroupName2 = Split2(1)
    
    
                        If GroupName2.Contains("Groupe_user1") Then
                            Invoke(New MethodInvoker(Sub() ListView1.Items.Add(New ListViewItem({Member, ADuser.EmailAddress, GroupName2, ""}, 0))))
                        ElseIf GroupName2.Contains("Groupe_user2")
                            Invoke(New MethodInvoker(Sub() ListView1.Items.Add(New ListViewItem({Member, ADuser.EmailAddress, "", GroupName2}, 0))))
                        End If
    
                    Next
    
                End If
    
            Next Member
    
        End Sub
    
    
        Public Function GetGroupMembers(ByVal strDomain As String, ByVal strGroup As String) As System.Collections.Specialized.StringCollection
    
            Dim GroupMembers As New System.Collections.Specialized.StringCollection()
    
            Try
                Dim DirectoryRoot As New DirectoryEntry("LDAP://" & Environment.UserDomainName)
                Dim DirectorySearch As New DirectorySearcher(DirectoryRoot, "(CN=" & strGroup & ")")
                Dim DirectorySearchCollection As SearchResultCollection = DirectorySearch.FindAll()
    
                For Each DirectorySearchResult As SearchResult In DirectorySearchCollection
                    Dim ResultPropertyCollection As ResultPropertyCollection = DirectorySearchResult.Properties
                    Dim GroupMemberDN As String
                    For Each GroupMemberDN In ResultPropertyCollection("member")
                        Dim DirectoryMember As New DirectoryEntry("LDAP://" & GroupMemberDN)
                        Dim DirectoryMemberProperties As System.DirectoryServices.PropertyCollection = DirectoryMember.Properties
                        Dim DirectoryItem As Object = DirectoryMemberProperties("sAMAccountName").Value
                        If DirectoryItem IsNot Nothing Then
                            GroupMembers.Add(DirectoryItem.ToString())
                        End If
                    Next GroupMemberDN
                Next DirectorySearchResult
            Catch ex As Exception
    
            End Try
    
            Return GroupMembers
    
        End Function


    ListView:

    -
    Edité par Mojow 3 novembre 2022 à 16:43:11

    • Partager sur Facebook
    • Partager sur Twitter
      3 novembre 2022 à 17:47:53

      Je pense que le problème est au niveau des lignes 51 à 55: si un utilisateur est membre des 2 groupes, il sera ajouté 2 fois, une fois pour le groupe_user1 et une autre fois pour le groupe_user2

      Tu ne devrais ajouter l'item qu'à la sortie de la boucle

      Dim group As New DirectoryEntry(searchResults(0).Path)
      Dim G1 as String=""
      Dim G2 as String=""
      For Each Info As String In group.Properties("MemberOf")
          If Info.Contains("Groupe_user1") Then
              Dim Split1 = Split(Info, ",")
              Dim Split2 = Split(Split1(0), "=")
              G1= Split2(1)
           End If
           If Info.Contains("Groupe_user2") Then
              Dim Split1 = Split(Info, ",")
              Dim Split2 = Split(Split1(0), "=")
              G2= Split2(1)
           End If
      Next
      If G1<>"" Or G1<>"" then Invoke(New MethodInvoker(Sub() ListView1.Items.Add(New ListViewItem({Member, ADuser.EmailAddress, G1, G2}, 0))))
      
      


      Peut-être utiliser un DirectorySearcher pour ne récupérer que les CN contenant l'un ou l'autre des groupes (voir le code de  ce sujet SO https://stackoverflow.com/a/27123768 )

      • Partager sur Facebook
      • Partager sur Twitter
        4 novembre 2022 à 10:20:39

        Bonjour umfred,

        Merci pour ta réponse, j'avais deja essayé de mettre les items hors boucle mais sa ne fonctionnait pas.

        Je regarde le lien que tu as posté.

        • Partager sur Facebook
        • Partager sur Twitter
          4 novembre 2022 à 11:22:01

          et mon bout de code ? tu l'as testé ?
          • Partager sur Facebook
          • Partager sur Twitter
            4 novembre 2022 à 14:38:17

            Merci umfred,

            Ton code fonctionne a merveille.

            (+1000 si je le pouvait)

            J'aimerai customiser mon tableau (largeur et longeur des cases, couleurs etc..), me conseil tu d'utiliser un ListeView ou un DataGridView ?

            • Partager sur Facebook
            • Partager sur Twitter
              4 novembre 2022 à 14:57:19

              Probablement un datagridview, regarde leur doc respective si tu veux plus d'info sur chacun.
              Je précise que mon code est sans doute fonctionnel, mais je pense que l'on peut faire mieux qu'utiliser des split. Si j'ai compris ce qu'il s'agit, tu récupères le CN de chaque groupe dont l'utilisateur est membre, donc avec le DirectorySearcher que je mentionnais, tu pourrais peut-être avoir directement et uniquement la valeur du CN et ainsi te passer des split
              • Partager sur Facebook
              • Partager sur Twitter
                4 novembre 2022 à 15:06:34

                Oui tu as surement raison, j'ai essayé avec le DirectorySearcher mais sans succès puis j'ai essayé ton code et c'est fonctionne..
                • Partager sur Facebook
                • Partager sur Twitter

                Doublon dans listView

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown