Понятие "исчерпывания имен" кажется абсолютно внешним мне.
Вы обеспечили бы образец того, как это могло бы произойти?
Для ответа на последний вопрос, необходимо смочь проверить название NetBios вручную путем проверки раздела Configuration и затем Разделов Каталога в ADSIEdit:
CN=MYNETBIOSNAME,CN=Partitions,CN=Configuration,DC=mydomain,DC=internal
Это имеет обоих name
и netBIOSName
свойства. Иначе я думаю, что необходимо было бы получить его от fqdn/DN, как squillman предполагает.
Я думаю, что понял это. Используя Редактирование ADSI можно посмотреть на свойства на объекте (например, пользователь), но по умолчанию оно отфильтровывало "созданные" атрибуты. Используя кнопку Filter в правом нижнем углу экрана свойств я смог показать эти дополнительные атрибуты.
"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", и это, кажется, не изменяется. Так, мне, вероятно, придется найти способ вынудить это быть измененным или просто сказать, что этот сценарий не поддерживается.
Необходимо будет проанализировать его из любого dn
(distinguishedName) или AdsDSPath
атрибуты. Объекты доменного имени снабжаются префиксом "DC="
в этих атрибутах. Крайнее левое DC=
будет содержать Ваше netbios доменное имя.
Например: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com
mydomain
netbios доменное имя.
Править:
Как Brian Desmond указывает, это - не обязательно авторитетный способ найти фактическое имя netbios, это - просто совпадение, что они обычно коррелируют. См. ответ BoyMars для авторитетного пути.
Для приложения? Microsoft делает это довольно простым в.NET. Это должно предоставить Вам список имен домена Netbios, которые можно использовать для создания списка пользовательских объектов с именами домена DN/DNS/Netbios или словарей перекрестных ссылок.
Кроме того, что определяет, доступен ли атрибут в Глобальном Каталоге, (еще один) атрибут, названный isMemberOfPartialAttributeSet. Используя Microsoft SysInternals AD Explorer, можно искать контейнер Схемы в домене и искать любой объект, который имеет isMemberOfPartialAttributeSet = верный для наблюдения всех атрибутов, которые доступны для запроса 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;
}
Если у Вас есть Пользовательское Имя Принципала или DN, можно использовать библиотеку COM ActiveDS для перевода значений. Ниже пример для перевода 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);
}
}
}