[VB.net/AD] Meerdere filters combineren

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Avvd
  • Registratie: November 2003
  • Niet online
Het begint al aardig te lukken in vb, het lijkt toch wel flink op delphi in veel opzichten. Alleen heb ik nog één vraagje.

ik heb een formuliertje gemaakt waar je gebruikers kan opzoeken en groepen etc. Alleen lukt het me niet om naar een combinatie van die 2 te zoeken.

Dit is wat ik nu in ieder geval heb:
code:
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
Imports System
Imports System.DirectoryServices

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim rootEntry _
        As New DirectoryEntry("GC://dc=domein,dc=local")

        Dim searcher As New DirectorySearcher(rootEntry)
    End Sub

    Private Sub BtZoekGroep_Click...

    Private Sub BtClearAll_Click_1...

    Private Sub BtToevoegen_Click...

    Private Sub BtZoekUser_Click...

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Results.Items.Clear()
        Dim rootEntry _
        As New DirectoryEntry("GC://dc=domein,dc=local")

        Dim searcher As New DirectorySearcher(rootEntry)
        searcher.PropertiesToLoad.Add("cn")
        'searcher.PropertiesToLoad.AddRange(New String() {"cn"})
        'would also work and saves you some code

        searcher.PageSize = 5
        searcher.ServerTimeLimit = New TimeSpan(0, 0, 30)
        searcher.ClientTimeout = New TimeSpan(0, 10, 0)

        searcher.Filter = TextBox1.Text

        Dim queryResults As SearchResultCollection
        queryResults = searcher.FindAll()

        Dim result As SearchResult

        For Each result In queryResults
            Results.Items.Add(result.Properties("cn")(0))
        Next


    End Sub
End Class

In de textbox kan ik nu diverse filters invoeren om zo te zoeken in de active directory.

De volgende filters werken gewoon goed:
(&(objectCategory=group)(|(cn=p*))) Dit geeft dus alle groepen die beginnen met een p
(&(objectCategory=person)(|(cn=henk jansen))) Nu zie je dus iedereen die henk jansen heet.

opzich zou het met zo'n filter ook mogelijk moeten zijn om er achter te komen wie er allemaal lid zijn van een bepaalde groep.
Nu staan er op deze site diversee manieren om dit te doen:
http://www.rlmueller.net/ADOSearchTips.htm

maar als ik daar iets van probeer komen er gewoon geen resultaten zoals bijvoorbeeld deze:
code:
1
2
To return all users that are direct members of a specified group. You must specify the Distinguished Name of the group. Wildcards are not allowed:
"(&(objectCategory=person)(objectClass=user)" _ & "(memberOf=cn=TestGroup,ou=Sales,dc=MyDomain,dc=com))"


Alle losse filters werken eigenlijk wel maar als je een combinatie wilt gaat het fout. Weet iemand hier een oplossing voor?

Acties:
  • 0 Henk 'm!

  • Avvd
  • Registratie: November 2003
  • Niet online
schopje

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb niet zo veel ervaring met Active Directory, dus met de juiste zoekstring kan ik je niet helpen. Maar het lijkt me handig om eerst de juiste zoekstring te defineren, voordat je gaat beginnen met het combineren van userinput.

Dus levert
Visual Basic .NET:
1
searcher.Filter = "(&(objectCategory=person)(objectClass=user)(memberOf=cn=TestGroup,ou=Sales,dc=MyDomain,dc=com))"

Dit het juiste resultaat op? Is er overigens niet ook een tool, waarmee je je LDAP queries uit kunt testen? Dan kun je eerst een goede zoekstring formuleren en daarna kan je gaan kijken hoe je dat het best kunt combineren met je user-input

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 10:58

BM

Moderator Spielerij
Opzich zou je met een applicatie als dit: http://www.ldapbrowser.com/ (freeware versie aanwezig) een eind moeten komen vwbt het testen van je searchqueries.

Mocht je dan eenmaal de juiste query gevonden hebben is het een kleinigheid om deze dynamisch op te bouwen :)

[ Voor 5% gewijzigd door BM op 18-05-2009 09:20 ]

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Avvd
  • Registratie: November 2003
  • Niet online
Ik was er vorige week toch weer mee verder gegaan aangezien ik er even zat van had. Nu is het me inmiddels wel gelukt om de gebruikers in de groeppen etc te zoeken. Nu komt dan de volgende stap wat me niet lukt en dan is het toevoegen van gebruikers in een groepen en het verwijderen van gebruikers in een groep.

ik had hiervan de volgende stukjes code gevonden:
How to add a user to the local system by using Directory Services in Visual Basic .NET or in Visual Basic 2005
Hier wordt beschreven hoe je het voor lokale users doet. Ook krijg ik dit scriptje niet omgezet in gewoon vb.

de volgende die ik had gevonden was deze:
code:
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
''' <summary>
''' Method to add a user to a group
''' </summary>
''' <param name="de"></param>
''' <param name="deUser"></param>
''' <param name="GroupName"></param>
Public Shared Sub AddUserToGroup(ByVal de As DirectoryEntry, ByVal deUser As DirectoryEntry, ByVal GroupName As String)
Dim deSearch As DirectorySearcher = New DirectorySearcher()
deSearch.SearchRoot = de
deSearch.Filter = "(&(objectClass=group) (cn=" & GroupName & "))"
Dim results As SearchResultCollection = deSearch.FindAll()
Dim isGroupMember As Boolean = False
If results.Count>0 Then
Dim group As DirectoryEntry = GetDirectoryEntry(results(0).Path)
Dim members As Object = group.Invoke("Members",Nothing)
For Each member As Object In CType(members, IEnumerable)
Dim x As DirectoryEntry = New DirectoryEntry(member)
Dim name As String = x.Name
If name <> deUser.Name Then
isGroupMember = False
Else
isGroupMember = True
Exit For
End If
Next member
If (Not isGroupMember) Then
group.Invoke("Add", New Object() {deUser.Path.ToString()})
End If
group.Close()
End If
Return


dit stukje komt van deze site af:
http://www.vbdotnetheaven...20216AM/ADandNETInVB.aspx

Opzich ziet dit er veel belovend uit alleen weet ik niet hoe je hier nu de input geeft. Ook heb ik hier probleem dat hij aangeeft dat de "GetDirectoryEntry" (regel 14) niet gedeclareerd was.

Weet iemand hoe ik dit stukje moet aanvullen?

Acties:
  • 0 Henk 'm!

  • Avvd
  • Registratie: November 2003
  • Niet online
schop

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Vertel eerst eens wat je allemaal geprobeerd hebt om de code zelf aan te vullen.

Op deze manier lijkt het er erg op dat je gewoon code dumpt en maar verwacht dat wij het voor jou afmaken.

Dat "GetDirectoryEntry" niet gedeclareerd is, zou je toch minstens zelf moeten kunnen verklaren. Hoe je input aan een functie geeft kan je ook in elke tutorial vinden. Je zult dus gewoon een parameter aan je functie toe moeten voegen die je weer ergens met je zoekstring combineert.

En het is ook wel makkelijk om een beetje normale identing aan te houden in je code, want op deze manier ga ik ieder geval niet eens de moeite nemen om het door te lezen.

[ Voor 15% gewijzigd door Woy op 03-06-2009 11:59 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Avvd
  • Registratie: November 2003
  • Niet online
Naar mijn weten zou de GetDirectoryEntry een functie zijn binnen de System.DirectoryServices functie die ik aan het begin van de code had aangeroepen met imports.

opzich snap ik ook wel dat "de", "deuser" en "groupname" als parameter moeten worden opgegeven. De groupname is gewoon een string maar "de" en "deuser" zouden van het type directoryentry zijn. Ik kan niet vinden wat voor input zo'n variable dan nodig zou hebben.


Hier even een netter stukje code (wat is de tag voor vb code? dit kan ik namelijk niet in de help van dit forum terug vinden):
code:
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
     Public Shared Sub AddUserToGroup(ByVal de As DirectoryEntry, ByVal deUser As DirectoryEntry, ByVal GroupName As String)
        Dim deSearch As DirectorySearcher = New DirectorySearcher()
        deSearch.SearchRoot = de
        deSearch.Filter = "(&(objectClass=group) (cn=" & GroupName & "))"

        Dim results As SearchResultCollection = deSearch.FindAll()

        Dim isGroupMember As Boolean = False

        If results.Count > 0 Then
            Dim group As DirectoryEntry = GetDirectoryServices(results(0).Path)
            Dim members As Object = group.Invoke("Members", Nothing)
            For Each member As Object In CType(members, IEnumerable)
                Dim x As DirectoryEntry = New DirectoryEntry(member)
                Dim name As String = x.Name
                If name <> deUser.Name Then
                    isGroupMember = False
                Else
                    isGroupMember = True
                    Exit For
                End If
            Next member
            If (Not isGroupMember) Then
                group.Invoke("Add", New Object() {deUser.Path.ToString()})
            End If
            group.Close()
        End If
        Return
    End Sub

Acties:
  • 0 Henk 'm!

  • Avvd
  • Registratie: November 2003
  • Niet online
schop

Acties:
  • 0 Henk 'm!

  • Avvd
  • Registratie: November 2003
  • Niet online
Het is me uiteindelijk gelukt met het volgende stuk code:

code:
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
    Public Shared Sub AddUserToGroup(ByVal deUser As DirectoryEntry, ByVal GroupName As String)
        Dim ldapRoot As DirectoryEntry = New DirectoryEntry()
        '========
        ldapRoot.Path = "LDAP://ou=groups,dc=domein,dc=local"

        Dim deSearch As DirectorySearcher = New DirectorySearcher()
        deSearch.SearchRoot = ldapRoot
        deSearch.Filter = "(&(objectClass=group) (cn=" & GroupName & "))"
        Dim results As SearchResultCollection = deSearch.FindAll()
        Dim isGroupMember As Boolean = False
        If results.Count > 0 Then
            Dim group As DirectoryEntry = results(0).GetDirectoryEntry
            Dim members As Object = group.Invoke("Members", Nothing)
            For Each member As Object In CType(members, IEnumerable)
                Dim x As DirectoryEntry = New DirectoryEntry(member)
                Dim name As String = x.Name
                If name <> deUser.Name Then
                    isGroupMember = False
                Else
                    isGroupMember = True
                    Exit For
                End If
            Next member
            If (Not isGroupMember) Then
                group.Invoke("Add", New Object() {deUser.Path.ToString()})
            End If
            group.Close()
        End If


Helaas heb ik hier wel ldap moeten gebruiken wat ontzettend traag werkt. Voor het zoeken gebruik ik GC wat de resultaten eigenlijk instant op het scherm neerzet. Als ik nu een user toevoeg duurt het ongeveer een minuut voordat het daadwerkelijk is ingevoerd. Is het ook te regelen dat dit ook met GC kan? Of in ieder geval iets wat sneller werkt.

EDIT:
Het blijkt dat als ik zoek via ldap het toevoegen via ldap ook ineens snel gaat. erg apart maarja het werkt in ieder geval.

[ Voor 3% gewijzigd door Avvd op 08-06-2009 17:16 ]

Pagina: 1