2010-03-03 6 views
5

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.

Antwort

2

Ich bin nicht mit DirectoryServices vertraut, aber wenn ich Ihre Frage richtig verstanden habe, könnten Sie Reflexionen verwenden, um die Eigenschaften Ihres Benutzerobjekts festzulegen. Um die richtigen Eigenschaften festzulegen, sollten Sie die Namen der Eigenschaften mit Daten vergleichen, die in den Attributen der Eigenschaften des Objekts des Benutzers gespeichert sind.

Wenn Namen der Eigenschaften, die Sie füllen möchten, sich ändern können, können Sie die Zuordnung von Eigenschaften im Wörterbuch speichern.

+0

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! –

Verwandte Themen