Active Directory Gruppeninformationen auslesen in VB.NET

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Active Directory Gruppeninformationen auslesen in VB.NET

    Guten Tag,ich habe folgendes Problem: Ich möchte alle AD-Gruppen, welche im Namen die Wörter "FS-NF-Projekte" enthalten, auslesen. Dazu sollen noch die beiden Felder managedby und info ausgelesen werden. Dies funktioniert leider nur zum Teil. Es werden nur die Gruppen ausgelesen, bei denen die beiden Felder auch gefüllt sind. Ich möchte aber auch die Gruppen ausgegeben bekommen, bei denen die Felder leer sind. Das Ergebnis soll in einem Datagridview dargestellt werden: Gruppe - Managedby - Info. Mein bisheriger Code sieht folgendermaßen aus:

    VB.NET-Quellcode

    1. Dim objADAM As DirectoryEntry ' Binding object.
    2. Dim objGroupEntry As DirectoryEntry ' Group Results.
    3. Dim objSearchADAM As DirectorySearcher ' Search object.
    4. Dim objSearchResults As SearchResultCollection ' Results collection.
    5. Dim strPath As String ' Binding path.
    6. ' OU die durchsucht werden soll
    7. strPath = "LDAP://OU=Root,DC=nordsh,DC=local"
    8. objSearchADAM = New DirectorySearcher(objADAM)
    9. objSearchADAM.Filter = "(&(objectClass=group)(name=FS-NF-projekte*))"
    10. objSearchADAM.SearchScope = SearchScope.Subtree
    11. objSearchResults = objSearchADAM.FindAll()
    12. ' Gruppen auflisten
    13. If objSearchResults.Count <> 0 Then
    14. Dim objResult As SearchResult
    15. For Each objResult In objSearchResults
    16. objGroupEntry = objResult.GetDirectoryEntry()
    17. For Each objManagedBy In objGroupEntry.Properties("managedby")
    18. For Each objinfo In objGroupEntry.Properties("info")
    19. DataGridView1.Rows.Add((objGroupEntry.Name), objManagedBy, objinfo)
    20. Next objinfo
    21. Next objManagedBy
    22. Next objResult
    23. Else
    24. MsgBox("Gruppe nicht gefunden", vbCritical, "Fehler")
    25. End If


    Vielen Dank für eure Hilfe
    Willkommen im Forum. :thumbup:

    juliansw schrieb:

    VB.NET-Quellcode

    1. objSearchADAM = New DirectorySearcher(objADAM)
    objADAM ist in Deinem Code lediglich ein Null-Pointer, die Variable ist nicht instanziiert.
    Kann es sein, dass Du nicht Option Strict On hast :?:
    ============

    VB.NET-Quellcode

    1. For Each objManagedBy In objGroupEntry.Properties("managedby")
    2. For Each objinfo In objGroupEntry.Properties("info")
    3. DataGridView1.Rows.Add((objGroupEntry.Name), objManagedBy, objinfo)
    4. Next objinfo
    5. Next objManagedBy
    Hier solltest Du eine Schleife draus machen, jede Gruppe für sich allein.
    ==============

    VB.NET-Quellcode

    1. Dim strPath As String ' Binding path.
    Diese Variable wird nicht verwendet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Vielen Dank schon mal für die Hinweise.
    Option Strict ist tatsächlich auf off.

    Leider weiß ich nicht, wie ich eine Schleife daraus machen soll. ich kann die einzelnen Properties nicht abfragen, da es sich um eine PropertyValueCollection handelt. Kannst du mir hier ein Beispiel nennen, wie das ginge?
    @juliansw Wie soll denn die Tabelle aussehen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dein Bild sieht eher nach diesem Code aus:

    VB.NET-Quellcode

    1. For Each objResult In objSearchResults
    2. objGroupEntry = objResult.GetDirectoryEntry()
    3. Dim objManagedBy = objGroupEntry.Properties("managedby")(0) ' 1. Element auslesen (TODO: testen, ob vorhanden)
    4. Dim objinfo = objGroupEntry.Properties("info")(0) ' 1. Element auslesen (TODO: testen, ob vorhanden)
    5. DataGridView1.Rows.Add(objGroupEntry.Name, objManagedBy, objinfo)
    6. 'For Each objManagedBy In objGroupEntry.Properties("managedby")
    7. ' For Each objinfo In objGroupEntry.Properties("info")
    8. ' DataGridView1.Rows.Add((objGroupEntry.Name), objManagedBy, objinfo)
    9. ' Next objinfo
    10. 'Next objManagedBy
    11. Next objResult

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wow, das hat gut funktioniert. Das einzige, was ich noch ergänzt habe ist folgendes:

    VB.NET-Quellcode

    1. On Error Resume Next
    2. For Each objResult In objSearchResults
    3. Dim objManagedBy = ""
    4. Dim objinfo = ""
    5. objGroupEntry = objResult.GetDirectoryEntry()
    6. objManagedBy = objGroupEntry.Properties("managedby")(0) ' 1. Element auslesen (TODO: testen, ob vorhanden)
    7. objinfo = objGroupEntry.Properties("info")(0) ' 1. Element auslesen (TODO: testen, ob vorhanden)
    8. DataGridView1.Rows.Add(objGroupEntry.Name, objManagedBy, objinfo)
    9. Next objResult


    Mit dem Error Resume Next umgehe ich die Fehlermeldung falls der Wert nicht vorhanden ist. Könnte man natürlich auch mit Try - Catch machen.
    Die beiden Variablen musste ich bei jedem Schleifeindurchlauf leeren, da sonst bei leeren Feldern der Wert der vorigen Gruppe eingetragen wird.

    @RodFromGermany
    Ich sage Vielen Dank für deine Hilfe :)

    juliansw schrieb:

    Error Resume Next
    Dies solltest Du aus Deinem Gedächtnis streichen :!:
    Wie gesagt: Testen, ob vorhanden:

    VB.NET-Quellcode

    1. For Each objResult In objSearchResults
    2. objGroupEntry = objResult.GetDirectoryEntry()
    3. Dim objManagedBy = ""
    4. Dim objinfo = ""
    5. If objGroupEntry.Properties("managedby").Count > 0 Then ' wenn vorhanden
    6. objManagedBy = objGroupEntry.Properties("managedby")(0).ToString
    7. End If
    8. If objGroupEntry.Properties("info").Count > 0 Then ' wenn vorhanden
    9. objinfo = objGroupEntry.Properties("info")(0).ToString
    10. End If
    11. DataGridView1.Rows.Add(objGroupEntry.Name, objManagedBy, objinfo)
    12. Next objResult

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @juliansw Ich hoffe, Du hast den kleinen Unterschied mit .ToString bemerkt.
    Bei meinem ursprünglichen Code wurden 2 Variable vom Typ Object erstellt, die dem DGV zugewiesen wurden.
    Wenn Du initial 2 Leerstring-Variablen erstellt, musst Du die ausgelesenen Properties in einen String konvertieren, da eine Object-Variable unter Option Strict On keiner String-Variable zugewiesen werden kann.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @juliansw Mit Option Strict On wirst Du sofort darauf hingewiesen, wenn die Datentypen nicht übereinstimmen.
    Gugst Du Visual Studio - Empfohlene Einstellungen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!