Использование оператора с каталогами услуг - PullRequest
0 голосов
/ 06 августа 2010

Не могли бы вы мне помочь и сказать, правильно ли я использую выражение "using" в моей функции службы каталогов, которая получает удаленное имя из моей 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

1 Ответ

3 голосов
/ 05 октября 2010

Как правило, вы всегда должны вызывать Dispose для типов, которые реализуют IDisposableDirectoryEntry, и 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, и вместо этого получить «отличительное имя»непосредственно из результатов поиска в сложенном виде (этот код не проверен, так как я в настоящее время не в домене):

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