Как я могу преодолеть позднюю привязку в поиске Active Directory - PullRequest
1 голос
/ 09 марта 2009

У меня есть функция, которая извлекает полное имя пользователя на основе имени пользователя и домена. Эта функция выполняется в потоке ASP.NET от имени другого пользователя. Когда я использую средство поиска каталогов в удаленной ветви AD, я полагаю, что вместо свойства я получаю номер SID (не могу убедиться, что он встречается в другом окне).

public string GetUserFullName(string userName, string domainName)
{  
    DirectoryEntry rootEntry = new DirectoryEntry("GC://dc=company,dc=net");
    string filter = string.Format("(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(userPrincipalName={0}@{1}.company.net))", userName, domainName);
    DirectorySearcher searcher = new DirectorySearcher(rootEntry, filter, new string[] { "displayName" });
    rootEntry.AuthenticationType = AuthenticationTypes.Secure;
    searcher.PageSize = 1000;
    searcher.ServerTimeLimit = new TimeSpan(0, 10, 0);
    searcher.ReferralChasing = ReferralChasingOption.All;
    searcher.Asynchronous = false;

    SearchResult result = searcher.FindOne();
    if (result != null)
    {
        return (string) result.Properties["displayName"][0];
    }
    else
    {
        throw new Exception("Active Directory could not resolve your user name");
    }

}

Ответы [ 2 ]

3 голосов
/ 09 марта 2009

С какой версией .NET Framework вы работаете? В AD 3.5 были значительно переработаны компоненты .NET 3.5, и теперь предлагаются строго типизированные конструкции для пользователя, групп и тому подобного.

Ознакомьтесь с замечательной статьей " Управление принципами безопасности каталогов в .NET Framework 3.5 " от моих друзей Джо Каплана и Итана Вилански на MSDN. Отличный материал действительно.

Прежде всего, вы получаете класс с именем UserPrincipal, который строго типизирован, например, Все основные свойства являются свойствами вашего объекта. Очень полезно на самом деле.

Во-вторых, вы получаете хороший метод «запрос за примером» с использованием PrincipalSearcher - посмотрите этот пример из статьи Джо и Этана:

// create a principal object representation to describe
// what will be searched 
UserPrincipal user = new UserPrincipal(adPrincipalContext);

// define the properties of the search (this can use wildcards)
user.Enabled = false;
user.Name = "user*";

// create a principal searcher for running a search operation
PrincipalSearcher pS = new PrincipalSearcher();

// assign the query filter property for the principal object 
// you created
// you can also pass the user principal in the 
// PrincipalSearcher constructor
pS.QueryFilter = user;

// run the query
PrincipalSearchResult<Principal> results = pS.FindAll();

Console.WriteLine("Disabled accounts starting with a name of 'user':");
foreach (Principal result in results)
{
    Console.WriteLine("name: {0}", result.Name);
}

Если есть хоть какой-то шанс, попробуйте перейти на .NET 3.5 для своей рекламы AD

Марк

0 голосов
/ 09 марта 2009

Я завернул AD в удобную вспомогательную библиотеку и всегда использовал этот метод:

    /// <summary>
    /// Returns AD information for a specified userID.
    /// </summary>
    /// <param name="ntID"></param>
    /// <returns></returns>
    public ADUser GetUser(string ntID)
    {          
        DirectorySearcher search = new DirectorySearcher();        

        search.Filter = String.Format("(cn={0})", ntID);

        search.PropertiesToLoad.Add("mail");
        search.PropertiesToLoad.Add("givenName");
        search.PropertiesToLoad.Add("sn");
        search.PropertiesToLoad.Add("displayName");
        search.PropertiesToLoad.Add("userPrincipalName");
        search.PropertiesToLoad.Add("cn");

        SearchResult result = search.FindOne();

        return new ADUser(result);
    }

ADUser - это пользовательский класс, который сопоставляет SearchResult со строго типизированными свойствами.

Я не уверен, в чем ваша конкретная проблема, но это всегда работало для меня.

РЕДАКТИРОВАТЬ: Сравнивая наш код, я вижу, вы не говорите поиск для предварительной загрузки свойства ... Это, вероятно, ваша проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...