2009-08-12 2 views
4

Учитывая имя учетной записи NT (DOMAIN \ имя_пользователя), можно ли вывести, какой адрес LDAP для этого домена так, чтобы информация о пользователе могла быть просмотрена?Вывод LDAP-адреса из имени домена NT

Мой сценарий: У меня есть приложение asp.net, работающее на IIS, которое принимает как анонимных пользователей, так и пользователей домена. Анонимные пользователи должны войти в систему, но пользователи домена я проверяю заголовки серверов для имени пользователя домена, предоставленного IIS. Мне нужно найти какую-либо информацию из активного каталога, например, адрес электронной почты и т. Д. У меня это работает, если я укажу адрес LDAP в config, но не буду поддерживать это дополнительное значение конфигурации, если я смогу его избежать.

+0

Что вы подразумеваете под адресом LDAP? Адрес (имя хоста) для сервера LDAP? – Freddy

+0

Да, как в LDAP: // имя хоста –

+0

Разве у вас есть несколько доменов, в которых может находиться пользователь, а домены находятся в разных лесах Active Directory? – serialhobbyist

ответ

4

Если все домены являются частью одного и того же леса, вы должны иметь возможность выполнять глобальный поиск каталога (GC: // вместо LDAP: //). Вы получаете только частичный атрибут, но вы можете получить выдающееся имя, а затем стандартный LDAP: // поиск.

Если вы находитесь в ситуации, когда у вас есть разные домены, которые находятся в разных лесах, то одним простым способом было бы создать таблицу поиска имен доменов NetBIOS. Для каждого леса вы выполняете поиск поддерева CN = Разделы, CN = Конфигурация, DC = YourDomain, DC = com с фильтром (netBIOSname = *), и вы вернете список доменов в этом лесу. Атрибут dnsRoot предоставит вам DNS-имя домена, и вы можете просто использовать это для привязки или выполнить поиск DNS в нем и использовать первый адрес, с которым вы связываетесь. Или вы можете использовать dnsRoot для создания System.DirectoryServices.ActiveDirectory.DirectoryContext с помощью DirectoryContextType DirectoryServer, чтобы получить ссылку на контроллер домена. Или вы можете использовать nCName (дает вам имяименованиеконтекста домена).

Возможно, я могу больше помочь, если вы можете предоставить более подробную информацию или если это не было ясно.

Дополнительно:

  1. Вы можете получить DirectoryEntry, делая «бессерверную привязку», просто подачи DistinguishedName объекта в каталоге. Например. "LDAP: // CN = User1, CN = Users, DC = имя_домена, DC = ком". Это автоматически обнаружит соответствующий контроллер домена и привяжет его для получения объекта.
  2. Если вы выполняете поиск с использованием DirectorySearcher и не предоставляете объект SearchRoot, он автоматически привязывается к корню текущего домена. Вы можете предоставить SearchRoot, чтобы сузить поиск, но вам не нужно.
  3. Если вам абсолютно необходимо получить имя текущего домена, вы можете связать его с объектом 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.

+0

Я не очень хорошо знаком с контроллерами домена. Я боюсь, но я думаю, что понимаю, что вы говорите. Если у меня есть имя netBios контроллера леса, я могу использовать его для поиска адреса LDAP для домена пользователя. Моя проблема Я не знаю, как получить адрес для любого из контроллеров домена. Поэтому я предполагаю, что мой вопрос должен заключаться в том, что он выводит имя netBois контроллера домена для машины, когда пользователь является пользователем asp.net. –

+0

Хорошо. Решение будет зависеть от того, имеете ли вы дело с одним активным лесом каталога или несколькими: что это в вашем случае? Если это один лес, есть ли в лесу более одного домена? Является ли сервером ASP.NET в домене (или одним из доменов/лесов)? – serialhobbyist

+0

Будьте любезны поддерживать различные настройки, но у меня есть один лесный домен, к которому принадлежит сервер ASP.NET. –

Смежные вопросы