GetGroupMembers Funktion LDAP - return SAMAccountName

  • VB.NET
  • .NET 7–8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von HenryV.

    GetGroupMembers Funktion LDAP - return SAMAccountName

    Hallo,

    ich habe eine Function geschrieben, welche mir aktuell den Anzeigenamen zurückgibt. Ich brauche die Funktion aber jetzt so, dass mir der SAM ausgegeben wird. Ich weiß das man dem DirectoryEntry, oder DirectoryResult dies sagen muss. Wenn ich mir aber den SAM jetzt ausgeben lassen möchte (testweise mit einer MSGBox), dann bekomme ich einen Objektinstanz Fehler. Ich mache bestimmt nur einen kleinen Fehler, an sich funktioniert die Funktion aber so:

    VB.NET-Quellcode

    1. Public Function Test(Gruppe As String)
    2. Dim F As New Funktionen
    3. Dim RootDSE As New DirectoryEntry("LDAP://RootDSE")
    4. Dim DomainDN As String = RootDSE.Properties("DefaultNamingContext").Value
    5. Dim strPath = "LDAP://" & DomainDN
    6. Dim UsersInGroup As New Collection()
    7. Dim de As New DirectoryEntry(strPath)
    8. de.Username = "AD\" & GUI.Benutzername
    9. If GUI.Passwort = "" Or GUI.Passwort = " " Or GUI.Passwort = "(none)" Then
    10. MsgBox("Fehler beim erkennen des Passworts!")
    11. Else
    12. de.Password = F.Decrypt(GUI.Passwort, GUI.PrivateKey)
    13. Dim MemberSearcher As New DirectorySearcher
    14. With MemberSearcher
    15. .SearchRoot = de
    16. .Filter = "(&(ObjectClass=Group)(sAMAccountName=" & Gruppe & "))"
    17. .PropertiesToLoad.Add("Member")
    18. .PropertiesToLoad.Add("SamAccountName")
    19. End With
    20. Dim mySearchResults As SearchResult = MemberSearcher.FindOne()
    21. Dim thisuserSAN As String
    22. For Each User In mySearchResults.Properties("Member")
    23. thisuserSAN = de.Properties("SamAccountName").Value.ToString.ToLower
    24. MsgBox(thisuserSAN)
    25. Dim mystr2 As String = User.ToString()
    26. Dim cut_at2 As String = "CN="
    27. Dim x2 As Integer = InStr(mystr2, cut_at2)
    28. Dim string_after2 As String = mystr2.Substring(x2 + cut_at2.Length - 1)
    29. Dim s2 As String = string_after2
    30. Dim first2 As String
    31. Dim Index2 As String
    32. Try
    33. Index2 = s2.IndexOf("OU=")
    34. first2 = s2.Substring(0, Index2 - 1)
    35. Catch ex As Exception
    36. Index2 = s2.IndexOf("CN=")
    37. first2 = s2.Substring(0, Index2 - 1)
    38. End Try
    39. If first2.Contains("\") Then
    40. first2 = first2.Replace("\", "")
    41. End If
    42. UsersInGroup.Add(first2)
    43. Next
    44. End If
    45. Return UsersInGroup
    46. End Function


    Vielen Dank vorab für die Hilfe :)

    Grüße
    Peter
    Habe es selber herausgefunden. Es muss ein neues Searchresult erstellt werden. Ich habe nur die For Each Schleife angepasst. Hier der Code für jeden der auch das Problem hat:

    VB.NET-Quellcode

    1. Dim userEntry As New DirectoryEntry("LDAP://" & User.ToString())
    2. userEntry.Username = de.Username
    3. userEntry.Password = F.Decrypt(GUI.Passwort, GUI.PrivateKey)
    4. Dim userSearcher As New DirectorySearcher(userEntry)
    5. With userSearcher
    6. .Filter = "(objectClass=*)"
    7. .PropertiesToLoad.Add("sAMAccountName")
    8. End With
    9. Dim userSearchResult As SearchResult = userSearcher.FindOne()
    10. If userSearchResult IsNot Nothing AndAlso userSearchResult.Properties.Contains("sAMAccountName") Then
    11. UsersInGroup.Add(userSearchResult.Properties("sAMAccountName")(0).ToString())
    12. End If
    Schau dir einmal die PrincipalContext Klasse an

    VB.NET-Quellcode

    1. Dim SomeDomain As String = Environment.UserDomainName
    2. Dim SomeGroup As String = "Meine Gruppe"
    3. Using pctx As New PrincipalContext(ContextType.Domain, SomeDomain)
    4. Using grp As GroupPrincipal = GroupPrincipal.FindByIdentity(pctx, IdentityType.Name, SomeGroup)
    5. If grp IsNot Nothing Then
    6. For Each p As Principal In grp.GetMembers(True)
    7. Debug.Print($"{p.DisplayName} ({p.SamAccountName}), {SomeDomain}\{SomeGroup}")
    8. Next
    9. End If
    10. End Using
    11. End Using