Чи може запит LDAP в AD надати доменне ім’я netbios для одного облікового запису при використанні Глобального каталогу?


11

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

Ми створимо Глобальний каталог (GC), щоб надати нам доступ LDAP до декількох доменів, а через конфігурацію в додатку будемо зіставляти властивості LDAP з властивостями профілю користувача в програмі. При типовому AD доменне ім'я FQDN та netbios однакові для всіх користувачів, але за участю GC нам потрібна ця додаткова інформація. Нам дійсно потрібно лише доменне ім'я netbios (FQDN недостатньо хороший).

Можливо, є запит LDAP, який можна зробити, щоб запитати цю інформацію від більш об’єкта верхнього рівня в AD?

Відповіді:


5

Я думаю, я це зрозумів. За допомогою редагування ADSI можна переглянути властивості об’єкта (наприклад, користувача), але за замовчуванням він фільтрував "побудовані" атрибути. За допомогою кнопки «Фільтр» в нижній правій частині екрана властивостей я зміг показати ці додаткові атрибути.

Здається, що "msDS-PrincipalName" має значення "[доменне ім'я netbios] \ [sAMAccountName]".

Якщо я зайти в Користувачі та комп’ютери AD та зміню "Ім'я користувача" з "gwasington@test.kirkdev.local" на "gwash2ington@test.kirk2dev.local", це впливає на атрибут "userPrincipalName", але не на "msDS- Атрибут PrincipalName ". Це добре в моєму випадку, оскільки моя інша система (SharePoint) не визнає цієї зміни.

Якщо я ввійду в AD Користувачі та комп’ютери та зміню "Ім'я користувача для входу (до Windows 2000)" з "KIRKDEV \ gwashington" на "KIRKDEV \ g2washington" (зауважте, що я не можу змінити першу частину), це не впливає. «UserPrincipalName» атрибут, але це впливає на атрибут «MSDS-PrincipalName». Це саме те, що я хочу, тому що моя інша система (SharePoint) визнає цю зміну.

Бічна примітка: Я сказав, що SharePoint визнає зміни, але це лише в тому випадку, якщо користувач ніколи раніше не входив у цю колекцію сайтів SharePoint. Після того як користувач увійшов у колекцію сайтів SharePoint, поле tp_Login в таблиці UserInfo встановлюється зі значенням "msDS-PrincipalName" і це, схоже, не змінюється. Тож, можливо, мені доведеться знайти спосіб змусити це змінити або просто сказати, що цей сценарій не підтримується.


Я не підтвердив, що ми можемо насправді запитувати "msDS-PrincipalName" з Глобального каталогу. Це буде наступним кроком.
Кірк Лімохн

Ну, я збирався позначити свою відповідь правильною, але тепер я бачу, що Глобальний каталог не може запитувати msDS-PrincipalName. Фу, все ще не впевнений, як ми з'ясуємо доменне ім’я Netbios, не роблячи припущень (як це перша частина FQDN).
Кірк Лімохн

Щодо моєї бічної примітки, див. Сервер defaultfault.com/questions/234526/…, щоб допомогти отримати SharePoint для визнання зміни входу.
Кірк Лімохн

Це так називається побудований атрибут - тобто він розраховується на вимогу, коли запит робиться для об'єкта. Ви не можете відфільтрувати його в запиті через це.
Брайан Десмонд

Дякую за цю інформацію - мені дуже зручно під час запитів через LDAP від ​​SQL Server.
Ян Йейтс

3

Щоб відповісти на ваше останнє запитання, ви повинні мати можливість перевірити ім'я NetBios вручну, перевіривши розділ Конфігурація, а потім розділи Каталог у ADSIEdit:

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

Це має nameі netBIOSNameвластивості, і властивості. Інакше я думаю, що вам доведеться отримати його від fqdn / DN, як пропонує скулкмен.


Дякую @BoyMars. У мене виникли проблеми з пошуком "CN = конфігурація" на найвищому рівні в моєму домені. Я трохи покатався і не зміг знайти "Конфігурацію" або "Розділи каталогів". Однак, я думаю, я можу це зрозуміти (ось що, щоб опублікувати відповідь).
Кірк Лімохн

Гаразд, я просто придумав, як дістатися до CN = Конфігурація (вибачте, минуло вже 6 років, як я зіграв з LDAP та ADSI Edit). @BoyMars, я бачу, про що ти говориш. На жаль, для запиту доменного імені netbios виявляється, що мені потрібно переглядати всі об'єкти під CN = розділами, CN = конфігурація і для кожного з них бачити, чи є у нього атрибут "nETBIOSName". Можливо, запит, який говорить, що дайте мені всі об'єкти crossRef, де атрибут netBIOSName не є нульовим, зробив би свою справу. Це виглядає відносно просто в коді, але я повинен це зробити за допомогою конфігурації. :-(
Кірк Лімохн

Ось сторінка, на якій розповідається про те, як запросити netbiosname. Однак вони використовують код. Я підозрюю, що це не спрацює для мене. geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
Kirk Liemohn

але це пояснює місце розташування "AD зберігає ім'я netbios в контейнері іменування розділів, який зберігається всередині контейнера іменування конфігурації."
BoyMars

Це єдине авторитетне джерело інформації. Зокрема, згаданий об'єкт crossRef.
Брайан Десмонд

3

Для заявки? Microsoft робить це досить просто в .NET. Це має надати вам список доменних імен Netbios, які ви можете використовувати для створення списку користувацьких об'єктів із доменними DN / DNS / Netbios іменами або перехресними посиланнями.

Крім того, те, що визначає, чи доступний атрибут у Глобальному каталозі, є (ще одним) атрибутом, який називаєтьсяMemberOfPartialAttributeSet. Використовуючи 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;
}

Дякую за відповідь, але мені потрібно запустити це з машини, яка не є Windows. Однак, якщо потрібно, я думаю, що я міг би створити власну веб-службу в .NET та надати іншій машині цю інформацію. Це може бути резервний підхід.
Кірк Лімохн

2
Це також має бути прямим. Встановіть для базового DN значення "CN = Розділи, CN = Конфігурація" + базовий DN атрибута домену unknownName, а фільтр пошуку (& (nETBIOSName = *) (dnsRoot = <dns назва домену AD>)). Ви також можете шукати атрибут ncName замість dnsRoot, якщо ви хочете відповідати dn суфіксом домену замість імені dns.
Грег Аскеу

1

Вам доведеться проаналізувати його або з dn(izdName), або з AdsDSPathатрибутів. Суб'єкти доменних імен мають "DC="у цих атрибутах префікс . DC=Найменше ліворуч буде містити ваше доменне ім’я netbios.

Наприклад: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain - це доменне ім'я netbios.

EDIT:
Як зазначає Брайан Дезмонд, це не обов'язково є авторитетним способом пошуку власне імені netbios, вони просто співпадають. Дивіться відповідь BoyMars про авторитетний спосіб.


слідкуйте за обмеженням netbios в 15 знаків при використанні значень з рядка fqdn або DN, я не бачив багатьох доменів, які так довго використовують рядок :)
BoyMars

Дякую @squillman, але коли я створив цей домен, я навмисно зробив ім'я домену netbios не першою частиною FQDN лише тому, що це було можливо, і мені потрібно перевірити межі, оскільки мій код повинен працювати в різних середовищах. Тож у моєму випадку FQDN є test.kirkdev.local (наприклад, користувачем dn є "CN = Джордж Вашингтон, CN = Користувачі, DC = тест, DC = kirkdev, DC = локальний"), але доменне ім'я netbios - kirkdev.
Кірк Лімохн

Якщо ви використовуєте Windows, dsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnдає вам те, що ви хочете, з іменем NetBIOS у лапках. Оскільки він відносний, вам не знадобиться отримати повний шлях. Не впевнений, чи це допоможе ОП; він запитав про LDAP, тож це не чиста відповідь LDAP.
songei2f

@alharaka дякую за коментар, але ми запитуємо AD з комп'ютера, який не є MS. Ми могли б з цим впоратися, але ми дійсно хочемо, щоб це було частиною LDAP-запиту. Схоже, dsquery - це інструмент командного рядка Windows Server.
Кірк Лімохн

1
Вибачте, але це неправильно. Між основним компонентом домену (наприклад, dc = mydomain) та іменем NetBIOS домену немає абсолютно жодного зв'язку. Це просто спільний збіг, що вони згодні.
Брайан Десмонд

0

Якщо у вас є ім'я головного користувача або 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);
        }
    }
}

Дякую за відповідь, але мені потрібно це зробити на машині, яка не є Windows, а в ідеалі - через LDAP-запит.
Кірк Лімохн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.