Назад | Перейти на главную страницу

Может ли запрос LDAP в AD предоставить имя домена netbios для одной учетной записи при использовании глобального каталога?

Я использую ADSI Edit для просмотра свойств LDAP отдельной учетной записи пользователя в AD. Я вижу такие свойства, как userPrincipalName, но не вижу ни одного для полного доменного имени (FQDN) или имени домена netbios.

Мы будем настраивать глобальный каталог (GC), чтобы предоставить нам доступ LDAP к нескольким доменам, и через конфигурацию в приложении мы сопоставляем свойства LDAP со свойствами профиля пользователя в приложении. В типичной AD полное доменное имя и имя домена netbios одинаковы для всех пользователей, но с задействованным GC нам нужна эта дополнительная информация. Нам действительно нужно только доменное имя netbios (полного доменного имени недостаточно).

Может быть, есть запрос LDAP, который можно сделать, чтобы запросить эту информацию у объекта более высокого уровня в AD?

Думаю, я разобрался. Используя ADSI Edit, вы можете просматривать свойства объекта (например, пользователя), но по умолчанию он отфильтровывал «сконструированные» атрибуты. Используя кнопку «Фильтр» в правом нижнем углу экрана свойств, я смог показать эти дополнительные атрибуты.

Кажется, что "msDS-PrincipalName" имеет значение "[имя домена netbios] \ [sAMAccountName]".

Если я перейду в AD Users and Computers и изменю «User logon name» с «gwasington@test.kirkdev.local» на «gwash2ington@test.kirk2dev.local», это повлияет на атрибут «userPrincipalName», но не на «msDS- PrincipalName "атрибут. В моем случае это хорошо, потому что другая моя система (SharePoint) также не распознает это изменение.

Если я захожу в AD Users and Computers и меняю «User logon name (pre-Windows 2000)» с «KIRKDEV \ gwashington» на «KIRKDEV \ g2washington» (обратите внимание, что я не могу изменить первую часть), это не повлияет на атрибут "userPrincipalName", но делает влияет на атрибут «msDS-PrincipalName». Это именно то, что я хочу, потому что другая моя система (SharePoint) распознает это изменение.

Боковое примечание: я сказал, что SharePoint распознает изменение, но это только в том случае, если пользователь никогда раньше не входил в это семейство сайтов SharePoint. После того, как пользователь вошел в семейство сайтов SharePoint, в поле tp_Login в таблице UserInfo устанавливается значение «msDS-PrincipalName», которое, похоже, не меняется. Итак, мне, возможно, придется найти способ принудительно изменить это или просто сказать, что этот сценарий не поддерживается.

Для приложения? Microsoft делает это в .NET довольно просто. Это должно предоставить вам список доменных имен Netbios, которые вы можете использовать для создания списка настраиваемых объектов с именами DN / DNS / Netbios домена или словарями перекрестных ссылок.

Кроме того, то, что определяет, доступен ли атрибут в глобальном каталоге, - это (еще один) атрибут, называемый isMemberOfPartialAttributeSet. Используя Microsoft SysInternals AD Explorer, вы можете выполнить поиск в контейнере схемы в домене и найти любой объект, имеющий isMemberOfPartialAttributeSet = true, чтобы увидеть все атрибуты, доступные для запроса GC.

using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;

private void GetNetbiosNamesTest()
{
    DomainCollection domains = Forest.GetCurrentForest().Domains;
    foreach (Domain domain in domains)
    {
        Console.WriteLine("Domain Netbios name: {0}", this.GetDomainNetBiosName(domain));
    }
}

private string GetDomainNetBiosName(Domain domain)
{
    ForestRootDirectoryEntry = Forest.GetCurrentForest().RootDomain.GetDirectoryEntry();
    string forestConfigurationBindPath = String.Format("LDAP://CN=Partitions,CN=Configuration,{0}", ForestRootDirectoryEntry.Properties["distinguishedName"].Value);
    ForestRootConfigurationDirectoryEntry = new DirectoryEntry(forestConfigurationBindPath);

    string netBiosName = String.Empty;

    using (DirectorySearcher directorySearcher = new DirectorySearcher(ForestRootConfigurationDirectoryEntry))
    {
        directorySearcher.Filter = String.Format("(&(nETBIOSName=*)(dnsRoot={0}))", domain.Name);
        directorySearcher.PropertiesToLoad.AddRange(new String[] { "dnsRoot", "nETBIOSName" });
        var result = directorySearcher.FindOne();

        if ((result != null) && (result.Properties.Contains("nETBIOSName"))) netBiosName = result.Properties["nETBIOSName"][0].ToString();
    }
    return netBiosName;
}

Чтобы ответить на ваш последний вопрос, вы должны иметь возможность проверить имя NetBios вручную, проверив раздел Конфигурация, а затем Разделы каталогов в ADSIEdit:

CN=MYNETBIOSNAME,CN=Partitions,CN=Configuration,DC=mydomain,DC=internal

Это как name и netBIOSName свойства. В противном случае я думаю, вам придется получать его от fqdn / DN, как предлагает Сквиллман.

Вам нужно будет разобрать его либо из dn (уважаемое имя) или AdsDSPath атрибуты. Сущности доменного имени имеют префикс "DC=" в этих атрибутах. Крайний левый DC= будет содержать ваше доменное имя netbios.

Например: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain это доменное имя netbios.

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

Если у вас есть имя участника-пользователя или DN, вы можете использовать библиотеку ActiveDS COM для преобразования значений. Ниже приведен пример преобразования имени UserPrincipalName в имя NT4 (NetBios).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActiveDs;

namespace Foo.Repository.AdUserProfile
{
    public class ADUserProfileValueTranslate
    {
        public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName)
        {
            NameTranslate nameTranslate = new NameTranslate();
            nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName);
            return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4);
        }
    }
}