Dave Kreskowiak
Ладно, GetObject на самом деле не подходит для этого. Это требует совсем немного больше кода, чтобы работать должным образом.
Во-первых, ваш код жестко кодирует путь к каталогу для "поиска", так как ваш код на самом деле не выполняет никакого поиска вообще. Он также жестко кодирует IP-адрес для использования. Это плохо, потому что если этот сервер не работает или IP-адрес меняется, ваш поиск будет неудачным. Кроме того, если путь к каталогу вообще изменяется, ваш код должен быть изменен, чтобы учесть изменения в каталоге.
Это легко решить с помощью простого метода:
Function GetDefaultNamingContext() As String
Dim rootDse As New DirectoryEntry("LDAP://rootDSE")
Dim domainDn = rootDse.Properties("DefaultNamingContext").Value.ToString
Return domainDn
End Function
Теперь вам нужен метод для поиска объекта AD User по его samAccountName. Это гораздо сложнее, чем одна строка кода:
Function GetAdObjectForSamAccount(ByVal samAccountName As String)
' Validate we have something to search for.
If [String].IsNullOrEmpty(samAccountName) Then
Throw New ArgumentNullException(samAccountName)
End If
' Get the directory context to search.
Dim context As String = GetDefaultNamingContext()
' Setup a search for a samAccountName.
' First, point to the directory to search.
Using directory As New DirectoryEntry($"LDAP://{context}")
' Create a Searcher to do the work for us.
Using searcher As New DirectorySearcher(directory, $"samAccountName={samAccountName}")
' Search the entire subtree of the directory because
' Users can really be stored anywhere in a tree.
searcher.SearchScope = SearchScope.Subtree
' This will store the result of the search
Dim result As SearchResult
' This is going to be the DirectoryEntry object we
' return, if any.
Dim returnObject As DirectoryEntry = Nothing
' Search the diroectory for the object we want.
result = searcher.FindOne
' Check if an object result was found.
If result IsNot Nothing Then
' Grab the DirectoryEntry object for the found object.
returnObject = result.GetDirectoryEntry
End If
' Return whatever we found back to the caller.
Return returnObject
End Using
End Using
End Function
Зачем это делать? Потому что вы можете вызвать этот метод из других, которые все могут работать с пользовательским объектом так или иначе, но по-разному. Каждый из этих методов может использовать этот метод для захвата пользовательского объекта для них только на основе samAccountName.
Например, метод для возврата DisplayName для конкретного samAccountName или того, что вы называете "именем входа".
Function GetDisplayNameForSamAccount(ByVal samAccountName As String) As String
' Validate we have something to search for.
If [String].IsNullOrEmpty(samAccountName) Then
Throw New ArgumentNullException(samAccountName)
End If
Dim displayName As String = String.Empty
Dim adObject As DirectoryEntry = GetAdObjectForSamAccount(samAccountName)
If adObject IsNot Nothing Then
displayName = adObject.Properties("DisplayName")(0).ToString
End If
Return displayName
End Function
А позвонить сюда и получить полное имя, которое вы ищете, очень просто:
Dim name As String = GetDisplayNameForSamAccount("BCNF0167")
Console.WriteLine($"DisplayName = {name}")