我正在使用 ADSI Edit 查看 AD 中单个用户帐户的 LDAP 属性。我看到了 userPrincipalName 等属性,但没有看到完全限定域名 (FQDN) 或 netbios 域名的属性。
我们将设置全局目录 (GC),以便我们能够通过 LDAP 访问多个域,并通过应用程序中的配置将 LDAP 属性映射到应用程序内的用户配置文件属性。在典型的 AD 中,所有用户的 FQDN 和 netbios 域名都是相同的,但是由于涉及到 GC,我们需要这些附加信息。我们实际上只需要 netbios 域名(FQDN 不够好)。
也许可以进行 LDAP 查询以从 AD 中更顶级的对象请求此信息?
答案1
我想我明白了。使用 ADSI Edit,您可以查看对象(例如用户)的属性,但默认情况下它会过滤掉“构造的”属性。使用属性屏幕右下角的“过滤器”按钮,我可以显示这些附加属性。
“msDS-PrincipalName”似乎以“[netbios 域名]\[sAMAccountName]”作为其值。
如果我进入 AD 用户和计算机并将“用户登录名”从“[电子邮件保护]“ 到 ”[电子邮件保护]“这会影响“userPrincipalName”属性,但不会影响“msDS-PrincipalName”属性。这对我来说是件好事,因为我的其他系统(SharePoint)也无法识别此更改。
如果我进入 AD 用户和计算机并将“用户登录名(Windows 2000 之前)”从“KIRKDEV\gwashington”更改为“KIRKDEV\g2washington”(请注意,我无法更改第一部分),这不会影响“userPrincipalName”属性,但是做影响“msDS-PrincipalName”属性。这正是我想要的,因为我的其他系统(SharePoint)确实识别出这个变化。
附注:我说 SharePoint 确实识别出这种变化,但那只是在用户之前从未登录过该 SharePoint 网站集的情况下。一旦用户登录到 SharePoint 网站集,UserInfo 表中的 tp_Login 字段就会设置为“msDS-PrincipalName”值,而且这似乎没有变化。所以,我可能不得不想办法强制改变它,或者干脆说不支持这种情况。
答案2
要回答您的最后一个问题,您应该能够通过检查 ADSIEdit 中的配置部分然后检查目录分区来手动验证 NetBios 名称:
CN=MYNETBIOSNAME,CN=Partitions,CN=Configuration,DC=mydomain,DC=internal
它同时具有name
和netBIOSName
属性。否则,我认为您必须按照 squillman 的建议从 fqdn/DN 获取它。
答案3
对于应用程序?Microsoft 在 .NET 中使这一点变得相当简单。这将为您提供一个域 Netbios 名称列表,您可以使用该列表创建具有域 DN/DNS/Netbios 名称或交叉引用字典的自定义对象列表。
此外,确定属性是否在全局目录中可用的是另一个名为 isMemberOfPartialAttributeSet 的属性。使用 Microsoft SysInternals AD Explorer,您可以搜索域中的 Schema 容器,并搜索任何具有 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;
}
答案4
如果您有用户主体名称或 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);
}
}
}