web-dev-qa-db-ja.com

ADのLDAPクエリは、グローバルカタログを使用するときに、単一のアカウントのnetbiosドメイン名を提供できますか?

ADSI Editを使用して、ADの単一ユーザーアカウントのLDAPプロパティを調べています。 userPrincipalNameなどのプロパティは表示されますが、完全修飾ドメイン名(FQDN)またはnetbiosドメイン名のプロパティは表示されません。

グローバルカタログ(GC)をセットアップして、複数のドメインへのLDAPアクセスを提供し、アプリケーションの構成を通じて、LDAPプロパティをアプリケーション内のユーザープロファイルプロパティにマップします。一般的なADでは、FQDNとnetbiosドメイン名はすべてのユーザーで同じですが、GCが関係するため、この追加情報が必要です。本当に必要なのは、netbiosドメイン名だけです(FQDNでは不十分です)。

たぶん、ADのより上位のオブジェクトからこの情報を要求するために実行できるLDAPクエリがあるでしょうか。

11
Kirk Liemohn

私はそれを理解したと思います。 ADSI Editを使用すると、オブジェクト(ユーザーなど)のプロパティを確認できますが、デフォルトでは、「構築された」属性は除外されていました。プロパティ画面の右下にある[フィルター]ボタンを使用して、これらの追加属性を表示することができました。

「msDS-PrincipalName」の値は「[netbiosドメイン名]\[sAMAccountName]」のようです。

ADユーザーとコンピューターに移動し、「ユーザーログオン名」を「[email protected]」から「[email protected]」に変更すると、これは「userPrincipalName」属性に影響しますが、「msDS- PrincipalName」属性。他のシステム(SharePoint)もこの変更を認識しないため、これは私の場合に適しています。

ADユーザーとコンピューターに移動し、「ユーザーログオン名(Windows 2000以前)」を「KIRKDEV\gwashington」から「KIRKDEV\g2washington」に変更しても(最初の部分は変更できないことに注意)、これは影響しません「userPrincipalName」属性、ただしdoesは「msDS-PrincipalName」属性に影響します。他のシステム(SharePoint)がこの変更を認識しているので、これはまさに私が欲しいものです。

補足:SharePointは変更を認識しますが、これは、ユーザーがそのSharePointサイトコレクションに以前にログインしたことがない場合にのみです。ユーザーがSharePointサイトコレクションにログインすると、UserInfoテーブルのtp_Loginフィールドに "msDS-PrincipalName"値が設定され、変更されないようです。それで、私はそれを強制的に変更する方法を見つける必要があるかもしれません、またはこのシナリオはサポートされていないとだけ言ってください。

5
Kirk Liemohn

最後の質問に答えるには、ADSIEditの[構成]セクション、次に[ディレクトリパーティション]をチェックして、NetBIOS名を手動で確認できるはずです。

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

これにはnamenetBIOSNameの両方のプロパティがあります。そうでなければ、squillmanが示唆するように、fqdn/DNから取得する必要があると思います。

3
BoyMars

アプリケーションですか? Microsoftは、これを.NETでかなり簡単にしています。これにより、ドメインDN/DNS/Netbios名、または相互参照辞書を持つカスタムオブジェクトのリストを作成するために使用できるドメイン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;
}
3
Greg Askew

dn(distinguishedName)またはAdsDSPath属性のいずれかから構文解析する必要があります。ドメイン名エンティティの前には"DC="これらの属性。左端のDC=には、netbiosドメイン名が含まれます。

例えば: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomainはnetbiosドメイン名です。

編集:
ブライアン・デスモンドが指摘するように、これは必ずしも実際のネットビオス名を見つけるための信頼できる方法ではなく、それらが通常相関しているのは単なる偶然です。信頼できる方法については、BoyMarsの回答を参照してください。

1
squillman

ユーザープリンシパル名または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);
        }
    }
}
0
Jeff