Ich möchte eine wiederverwendbare Bibliothek für die Abfrage von AD mit LDAP schreiben. Ich verwende beide ActiveDs COM-Objekte und System.DirectoryServices.Wie wird der Eigenschaftswert über einen Attribut-Tag-Namen mithilfe der Reflektion festgelegt?
inspiriert Greatly von Bart de Smet LINQ to AD habe ich eine SchemaAttribute geschrieben und eine DirectoryAttributeAttribute Klassen mit einem DirectorySource zu verwenden (Of T) -Klasse (Ja, es ist VBNET, aber jeder C# -Code wird helfen, wie ich fließend bin in beiden Sprachen).
Wenn Sie jetzt mit LDAP (System.DirectoryServices) nach AD suchen, können Sie auswählen, welche Eigenschaft/welches Attribut von der DirectorySearcher-Klasse geladen werden soll. Dann habe ich mir eine Methode geschrieben, die ein ParramArray von String als Parameter verwendet, sodass ich die LDAP-Eigenschaften der DirectorySearcher.PropertiesToLoad() -Methode innerhalb einer foreach() -Anweisung hinzufüge. Hier ist ein Stück Code, um zu (Unter der Annahme, dass ldapProps Parameter immer Wert enthalten (s)):
Public Function GetUsers(ByVal ParamArray ldapProps() As String) As IList(Of IUser)
Dim users As IList(Of IUser) = New List(Of IUser)
Dim user As IUser
Dim de As DirectoryEntry = New DirectoryEntry(Environment.UserDomainName)
Dim ds As DirectorySearcher = New DirectorySearcher(de, "(objectClass=user)")
For Each p As String In ldapProps
ds.PropertiesToLoad(p)
Next
Try
Dim src As SearchResultCollection = ds.FindAll()
For Each sr As SearchResult In src
user = New User()
// This is where I'm stuck... Depending on the ldapProps required, I will fill only these in my User object.
Next
End Function
Hier ist ein Stück meiner Benutzerklasse:
Friend NotInheritable Class User
Implements IUser
Private _accountName As String
Private _firstName As String
<DirectoryAttributeAttribute("SAMAccountName")> _
Public Property AccountName As String
Get
Return _accountName
End Get
Set (ByVal value As String)
If (String.Equals(_accountName, value)) Then Return
_accountName = value
End Set
End Property
<DirectoryAttributeAttribute("givenName")> _
Public Property FirstName As String
Get
Return _firstName
End Get
Set (ByVal value As String)
If (String.Equals(_firstName, value)) Then Return
_firstName = value
End Set
End Property
End Class
Nun würde Ich mag um von diesen Attributen zu profitieren, die ich oben auf meine Benutzerklasseneigenschaften gesetzt habe. Ich weiß, wie man diese Attribute bekommt, und ich weiß, wie ich meine Eigenschaften bekomme. Was ich unsicher bin, ist, wie man sicherstellt, dass die richtige Eigenschaft den richtigen Wert von der SearchResult-Klasse auf meine Benutzerklasse gesetzt wird.
EDIT Im Laufe der Zeit gegen mich spielt, kann ich nicht mit dem Konzept des DirectorySource (Of T) warten kennen zu lernen, da es ein bisschen mehr Codierung für mich arbeiten zu schreiben zu bekommen erfordert. Als Workaround schreibe ich eine UserFactory-Klasse, die über meine ActiveDirectoryFacade aufgerufen wird.
EDIT Diese Frage SO scheint sehr nahe zu sein, was ich erreichen wollen:
Reflection, Attributes and Property Selection
EDIT Das sieht aus wie, was ich will: eine andere Idee C# setting property values through reflection with attributes
Jeder hat oder kann dies bestätigen ist richtig?
Ich werde auch erwähnen, dass ich stecken in .NET Framework 2.0 und VBNET2005. Sonst hätte ich die LINQ to AD-Bibliothek von Bart de Smet benutzt.
Danke für jede Hilfe.
Interessant! Ich dachte an diesen Ansatz, konnte aber einen einfachen Weg finden, um es zum Laufen zu bringen. Ich schätze, ich könnte es mit Ihrer Vorgehensweise arbeiten lassen. Ich werde es versuchen und Sie wissen lassen, ob es funktioniert. Vielen Dank! –