2010-03-18 9 views

Répondre

3

Tant que vous êtes sur .NET 2.0, c'est probablement aussi bon que possible. Ce que vous pouvez faire est d'ajouter les critères de « service » à votre filtre de recherche - de cette façon, vous laisserais jusqu'à AD pour faire le filtrage par département:

Private Sub GetUsersByDepartment(ByVal department as String) 
    Dim deGlobal As DirectoryEntry = New DirectoryEntry(ADPath, ADUser, ADPassword) 
    Dim ds As DirectorySearcher = New DirectorySearcher(deGlobal) 

    ds.Filter = "(&(objectCategory=person)(objectClass=user)(department=" & department & "))" 
    ds.SearchScope = SearchScope.Subtree 

    For Each sr As SearchResult In ds.FindAll 
    Dim newDE As DirectoryEntry = New DirectoryEntry(sr.Path) 
    If Not newDE Is Nothing Then 
      *Do Something* 
    End If 
    Next 
End Sub 

Cela aide certainement - je l'espère, en tant que Programmeur C#, je n'ai pas bousillé votre code VB! Le filtre LDAP vous permet essentiellement d'avoir un certain nombre de conditions à l'intérieur d'un support "anded" (le (&....) autour de vos deux conditions - vous pouvez facilement l'étendre à trois conditions comme je l'ai fait). Si vous avez une chance de passer à .NET 3.5, il y a un nouvel espace de noms appelé System.DirectoryServices.AccountManagement disponible, qui offre des approches bien meilleures et plus «intuitives» pour gérer les utilisateurs, les groupes, les ordinateurs et la recherche.

Consultez l'article MSDN Managing Directory Security Principals in the .NET Framework 3.5 pour en savoir plus à ce sujet.

Ce que vous pouvez faire est par ex. « Recherche par exemple », de sorte que vous pouvez créer un UserPrincipal et définir les propriétés que vous souhaitez filtrer, puis faire une recherche par cet objet comme un « modèle » presque:

UserPrincipal user = new UserPrincipal(adPrincipalContext); 
user.Department = "Sales"; 

PrincipalSearcher pS = new PrincipalSearcher(user); 

PrincipalSearchResult<Principal> results = pS.FindAll(); 

// now you could iterate over the search results and do whatever you need to do 

assez agréable en effet! Mais seulement sur .NET 3.5, malheureusement .... mais attendez - c'est juste un service pack sur .NET 2, vraiment :-)

+0

Cela fonctionne comme un charme, marc_s. Très appréciée! Croyez-moi, il y a * plusieurs * fonctionnalités de .NET 3.5 dont je voudrais profiter (c'est l'une d'entre elles). J'apprécie la solution améliorée et le conseil rapide sur DirectoryServices. :) –

0

Eh bien, voici ce que je suis venu. Cela semble fonctionner, mais je suis certainement ouvert aux suggestions ou aux solutions améliorées.

Private Sub GetUsersByDepartment(ByVal department as String) 
    Dim deGlobal As DirectoryEntry = New DirectoryEntry(ADPath, ADUser, ADPassword) 
    Dim ds As DirectorySearcher = New DirectorySearcher(deGlobal) 

    ds.Filter = "(&(objectCategory=person)(objectClass=user))" 
    ds.SearchScope = SearchScope.Subtree 

    For Each sr As SearchResult In ds.FindAll 
    Dim newDE As DirectoryEntry = New DirectoryEntry(sr.Path) 
    If Not newDE Is Nothing Then 
     If newDE.Properties.Contains("department") Then 
     If newDE.Properties("department")(0).ToString = department Then 
      *Do Something* 
     End If 
     End If 
    End If 
    Next 

End Sub