Я использую 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);
}
}
}