2010-08-06 2 views
0

Не могли бы вы помочь мне и сказать, правильно ли использовать «using statement» в моей функции directoryservice, которая получает distingushed имя из моего Active Directory. Я хочу правильно распоряжаться и закрывать объекты.Использование оператора с справочными службами

Код:

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

Что происходит с mySearcher? Задает ли этот оператор? –

+1

Добавьте код к вашему вопросу, а не внешнюю ссылку, которая может быть убрана завтра. –

+0

У вас есть конкретная причина, чтобы спросить ?? Кажется, хорошо для меня, насколько я могу судить ... вы видите проблемы, проблемы? –

ответ

3

Как правило, вы всегда должны называть Dispose по типам, которые реализуют IDisposable. Оба DirectoryEntry и DirectorySearcher реализация IDisposable. В вашем примере кода удаляется только первый объект DirectoryEntry. Вы должны добавить, используя блок для mySearcher и directoryObject, а также:

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

Вы можете фактически уменьшить нагрузку на сервер немного не используя GetDirectoryEntry и вместо того, чтобы получить «DistinguishedName» непосредственно из результатов поиска в феллинг (этот код не тестировался, так как я не в настоящее время находится в домене):

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

Большое спасибо! У меня есть аналогичный метод для получения пути ввода каталога (AdsPath), можно ли получить путь без использования GetDirectoryEntry? –

+0

@EasyDot: Я не уверен, что понимаю ваш вопрос. РазличаетсяName не равно AdsPath? –