корень имя леса может быть ontained из RootDSE раздела. Посмотрите на атрибут rootDomainNamingContext. Этот wiil возвращает вам лесной корневой домен. Я не рекомендую извлекать имя леса из DN пользователя, так как оно не будет работать, если у вас есть два дерева домена в одном лесу. Второй вариант - поиск пользователей в глобальном каталоге текущего домена. Глобальный каталог содержит частичную копию всех пользователей из всего леса
Код ниже выполняет поиск по глобальному каталогу. У меня 2 домена, в моем лесу, поэтому он возвращает мне 2 пользователя. Имейте в виду, что вам придется иметь дело с несколькими результатами вернулись:
var forest = Forest.GetCurrentForest();
var globalCatalog = GlobalCatalog.FindOne(new DirectoryContext(DirectoryContextType.Forest, forest.Name));
using (var connection = new LdapConnection(new LdapDirectoryIdentifier(globalCatalog.Name, 3268)))
{
var entries = new List<SearchResultEntry>();
var searchRequest = new SearchRequest(string.Empty, "(samaccountname=administrator)", SearchScope.Subtree, null);
var searchOptionsControl = new SearchOptionsControl(System.DirectoryServices.Protocols.SearchOption.DomainScope);
searchRequest.Controls.Add(searchOptionsControl);
var pageResultRequestControl = new PageResultRequestControl(1000);
searchRequest.Controls.Add(pageResultRequestControl);
do
{
var response = (SearchResponse)connection.SendRequest(searchRequest);
if (response != null)
{
if (response.ResultCode != ResultCode.Success)
{
throw new ActiveDirectoryOperationException(response.ErrorMessage, (int) response.ResultCode);
}
foreach (var c in response.Controls.OfType<PageResultResponseControl>())
{
pageResultRequestControl.Cookie = c.Cookie;
break;
}
entries.AddRange(response.Entries.Cast<SearchResultEntry>());
}
}
while (pageResultRequestControl.Cookie != null && pageResultRequestControl.Cookie.Length > 0);
}
Несколько заметок по этому коду: 1. Конечно, этот код не производство один. Вы можете написать более общий LdapSearcher, например, можно найти here. При необходимости вы можете сделать синхронную версию этого поисковика. 2. Я настоятельно рекомендую использовать LdapConnection вместо DirectorySearcher в приложениях, основанных на обслуживании, потому что использование DirectorySearcher в корпоративной среде приводит к утечкам памяти и другим issues
Вы пытались использовать выдающееся имя? – hofmeister
Уважаемый nAme? – STORM