使用全局目录时,AD 上的 LDAP 查询是否可以为单个帐户提供 netbios 域名?

使用全局目录时,AD 上的 LDAP 查询是否可以为单个帐户提供 netbios 域名?

我正在使用 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

它同时具有namenetBIOSName属性。否则,我认为您必须按照 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);
        }
    }
}

相关内容