2010-08-06 10 views
0

Pourriez-vous m'aider et indiquer si j'utilise correctement l'instruction "using" dans ma fonction directoryservice qui obtient un nom distinct de mon Active Directory. Je veux disposer et fermer correctement les objets.Utilisation de l'instruction avec directoryservices

code:

Public Function GetObjectDistinguishedName(ByVal objClass As objectClass, _ 
    ByVal returnValue As returnType, _ 
    ByVal objName As String, ByVal LdapDomain As String, _ 
    Optional ByVal includeLdapPrefix As Boolean = True) As String 

    Dim distinguishedName As String = String.Empty 
    Dim connectionPrefix = "LDAP://" & LdapDomain 

    Using entry As DirectoryEntry = New DirectoryEntry(connectionPrefix) 
     Dim mySearcher = New DirectorySearcher(entry) 
     Dim result As SearchResult 
     Dim directoryObject As DirectoryEntry 
     Select Case objClass 
      Case objectClass.user 
       mySearcher.Filter = "(&(objectClass=user)(|(cn=" + objName + ")(sAMAccountName=" + objName + ")))" 
      Case objectClass.group 
       mySearcher.Filter = "(&(objectClass=group)(|(cu=" + objName + ")(dn=" + objName + ")))" 
      Case objectClass.computer 
       mySearcher.Filter = "(&(objectClass=computer)(|(cn=" + objName + ")(dn=" + objName + ")))" 
      Case objectClass.organizationalunit 
       mySearcher.Filter = "(ou=" + objName + ")" 
     End Select 
     result = mySearcher.FindOne() 

     If result Is Nothing Then 'If the search results in nothing, call for help!' 
      Throw New NullReferenceException("Unable to locate the distinguishedName for the " & objClass.ToString & " : " & objName & " in the " & LdapDomain & " domain") 
     End If 

     directoryObject = result.GetDirectoryEntry() 
     If returnValue.Equals(returnType.distinguishedName) Then 
      If includeLdapPrefix Then 
       distinguishedName = "LDAP://" & directoryObject.Properties("distinguishedName").Value 
      Else 
       distinguishedName = directoryObject.Properties("distinguishedName").Value 
      End If 
     End If 
    End Using 
    Return distinguishedName 
End Function 
+0

Qu'advient-il de mySearcher? Est-ce que l'instruction Using dispose de cela? –

+1

Ajoutez le code à votre question, pas en tant que lien externe qui pourrait être parti demain. –

+0

Avez-vous une raison concrète de demander ?? Semble bon pour moi, autant que je peux dire ... voyez-vous des problèmes, des problèmes ?? –

Répondre

3

En règle générale, vous devez toujours appeler Dispose sur les types qui mettent en œuvre IDisposable. Les deux DirectoryEntry et DirectorySearcher mettent en œuvre IDisposable. Dans votre exemple de code, seul le premier objet DirectoryEntry est mis au rebut. Vous devez ajouter un aide de bloc pour mySearcher et directoryObject ainsi:

Using entry As DirectoryEntry = New DirectoryEntry(connectionPrefix) 
    Using mySearcher = New DirectorySearcher(entry) 
     '...' 
     Using directoryObject = result.GetDirectoryEntry() 
      '...' 
     End Using 
    End Using 
End Using 

Vous pouvez réellement alléger la charge sur votre serveur un peu à ne pas utiliser GetDirectoryEntry et au lieu de récupérer « distinguishedName » directement à partir du résultat de la recherche dans le folling façon (ce code n'a pas été testé car je ne suis pas actuellement sur un domaine):

mySearcher.PropertiesToLoad.Add("distinguishedName"); 
result = mySearcher.FindOne() 
'...' 
distinguishedName = result.Properties("distinguishedName")(0) 
+0

Merci beaucoup! J'ai une méthode similaire pour obtenir le chemin d'accès au répertoire (AdsPath), est-il possible d'obtenir le chemin sans utiliser GetDirectoryEntry? –

+0

@EasyDot: Je ne suis pas sûr de comprendre votre question. Est-ce que distinguishedName n'est pas égal à AdsPath? –