Если все домены являются частью одного и того же леса, вы должны иметь возможность выполнять глобальный поиск каталога (GC: // вместо LDAP: //). Вы получаете только частичный атрибут, но вы можете получить выдающееся имя, а затем стандартный LDAP: // поиск.
Если вы находитесь в ситуации, когда у вас есть разные домены, которые находятся в разных лесах, то одним простым способом было бы создать таблицу поиска имен доменов NetBIOS. Для каждого леса вы выполняете поиск поддерева CN = Разделы, CN = Конфигурация, DC = YourDomain, DC = com с фильтром (netBIOSname = *), и вы вернете список доменов в этом лесу. Атрибут dnsRoot предоставит вам DNS-имя домена, и вы можете просто использовать это для привязки или выполнить поиск DNS в нем и использовать первый адрес, с которым вы связываетесь. Или вы можете использовать dnsRoot для создания System.DirectoryServices.ActiveDirectory.DirectoryContext с помощью DirectoryContextType DirectoryServer, чтобы получить ссылку на контроллер домена. Или вы можете использовать nCName (дает вам имяименованиеконтекста домена).
Возможно, я могу больше помочь, если вы можете предоставить более подробную информацию или если это не было ясно.
Дополнительно:
- Вы можете получить DirectoryEntry, делая «бессерверную привязку», просто подачи DistinguishedName объекта в каталоге. Например. "LDAP: // CN = User1, CN = Users, DC = имя_домена, DC = ком". Это автоматически обнаружит соответствующий контроллер домена и привяжет его для получения объекта.
- Если вы выполняете поиск с использованием DirectorySearcher и не предоставляете объект SearchRoot, он автоматически привязывается к корню текущего домена. Вы можете предоставить SearchRoot, чтобы сузить поиск, но вам не нужно.
- Если вам абсолютно необходимо получить имя текущего домена, вы можете связать его с объектом RootDSE («LDAP: // RootDSE») и получить значение атрибута defaultNamingContext. Это вернет бит DC = yourdomain, DC = com.
Честно говоря, более общий код, вероятно, не стоит боли, если вы не уверены, что он вам понадобится, потому что он будет зависеть от структуры ваших доменов и лесов. Например. если у вас есть два леса, есть доверие между ними: вы не узнаете этого, пока у вас не будет двух лесов, и решение будет зависеть от этого. Есть гибкая небольшая максима в гибком развитии, которая ускользает от меня, но она идет по строкам, не кодируя то, что вам не нужно сейчас.
Вот консольная программа, которая будет выполнять такой поиск:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
namespace SearchDirectory
{
class Program
{
static void Main(string[] args)
{
string user = @"YOURDOMAIN\yourid";
using (DirectorySearcher ds = new DirectorySearcher())
{
ds.SearchScope = SearchScope.Subtree;
ds.Filter = String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
user.Split('\\')[1]);
ds.PageSize = 1000;
using (SearchResultCollection src = ds.FindAll())
{
foreach (SearchResult sr in src)
Console.WriteLine(sr.Properties["distinguishedName"][0].ToString());
}
}
Console.WriteLine("\r\nPress a key to continue...");
Console.ReadKey(true);
}
}
}
Я вырезать некоторые углы на это, но это должно вам начать работу. Мой совет - заставить его работать в консольной программе, а затем переместить класс в проект ASP.NET. Есть много нечетных ошибок System.DirectoryServices может вас бросить и использовать S.DS внутри ASP.NET может быть интересным, так что лучше всего знать, как работает ваш код, прежде чем вы его обернете во всей этой привлекательности ASP.NET.
Что вы подразумеваете под адресом LDAP? Адрес (имя хоста) для сервера LDAP? – Freddy
Да, как в LDAP: // имя хоста –
Разве у вас есть несколько доменов, в которых может находиться пользователь, а домены находятся в разных лесах Active Directory? – serialhobbyist