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


11

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

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

ADのよりトップレベルのオブジェクトにこの情報を要求するために実行できるLDAPクエリがあるのでしょうか?

回答:


5

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

「msDS-PrincipalName」には、値として「[netbios domain name] \ [sAMAccountName]」が表示されます。

ADユーザーとコンピューターに移動して、「ユーザーログオン名」を「gwasington@test.kirkdev.local」から「gwash2ington@test.kirk2dev.local」に変更すると、「msPrincipal-」属性ではなく「userPrincipalName」属性に影響します。 PrincipalName」属性。私の場合、他のシステム(SharePoint)もこの変更を認識しないため、これは良いケースです。

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

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


グローバルカタログから "msDS-PrincipalName"を実際にクエリできることを確認していません。それが次のステップです。
カークLiemohn

さて、答えを正しいものとしてマークしようとしていましたが、今ではグローバルカタログがmsDS-PrincipalNameを照会できないことがわかりました。ええと、まだFQDNの最初の部分のように、いくつかの仮定をせずにそこからnetbiosドメイン名をどのように計算するかはまだわかりません。
カークLiemohn

副次的な注意事項については、serverfault.com / questions / 234526 / ...を参照して、SharePointでログインの変更を認識できるようにしてください。
カークLiemohn

これは、構築済み属性と呼ばれるものです。つまり、オブジェクトに対して要求が行われたときにオンデマンドで計算されます。このため、クエリでフィルタリングすることはできません。
ブライアンデズモンド

この情報に感謝します-SQL ServerからLDAP経由でクエリを実行するときに非常に役立ちました。
イアンイェーツ

3

最後の質問に答えるには、構成セクションをチェックしてからADSIEditのディレクトリパーティションをチェックして、NetBios名を手動で確認できる必要があります。

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

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


ありがとう@BoyMars。ドメインの最上位で「CN = Configuration」を見つけるのに苦労しました。少し調べてみると、「構成」または「ディレクトリパーティション」が見つかりませんでした。しかし、私はこれを理解しているかもしれないと思う(答えを投稿しようとしている)。
カークLiemohn

OK、CN = Configurationに到達する方法を見つけただけです(申し訳ありませんが、LDAPとADSI Editで遊んでから約6年が経ちました)。@BoyMars、あなたの言っていることがわかります。残念ながら、netbiosドメイン名を照会するために、CN = Partitions、CN = Configurationの下にあるすべてのオブジェクトをループする必要があり、それぞれについて「nETBIOSName」属性があるかどうかを確認します。たぶん、netBIOSName属性がnullでないすべてのcrossRefオブジェクトを教えてくれるクエリは、トリックを行うでしょう。これは、コードで比較的簡単に実行できるように見えますが、構成を介して実行する必要があります。:-(
カークリエモン

以下は、netbiosnameを照会する方法を説明するページです。ただし、彼らはコードを使用しています。私はこれがうまくいかないと思う。 geekswithblogs.net/Tariq/archive/2009/07/30/133813.aspx
カークリエモン

ただし、「ADは構成名前付けコンテナー内に格納されているパーティション名前付けコンテナーにnetbios名を格納します」という場所を説明しています。
BoyMars

これが唯一の信頼できる情報源です。特に、言及されたcrossRefオブジェクト。
ブライアンデズモンド

3

アプリケーションの場合?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;
}

答えてくれてありがとう。しかし、Windows以外のマシンから実行する必要があります。ただし、必要に応じて、.NETで独自のWebサービスを作成し、他のマシンにこの情報を提供できると思います。これはフォールバックアプローチになります。
カークLiemohn

2
それも簡単なはずです。ベースDNを「CN = Partitions、CN = Configuration」+ドメインdistinguishedName属性のベースDNに設定し、検索フィルターを(&(nETBIOSName = *)(dnsRoot = <ADドメインのDN名>))に設定します。dns名の代わりにドメインのdnサフィックスを一致させる場合は、dnsRootの代わりにncName属性を検索することもできます。
グレッグアスキュー

1

dn(distinguishedName)またはAdsDSPath属性から解析する必要があります。"DC="これらの属性では、ドメイン名エンティティのプレフィックスが付きます。左端DC=には、netbiosドメイン名が含まれます。

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

mydomain netbiosドメイン名です。

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


fqdnまたはDN文字列からの値を使用するときに15文字のnetbios制限を監視しますが、長い文字列を使用するドメインはあまり見ませんでした:)
BoyMars

@squillmanに感謝しますが、このドメインを作成したときに、netbiosドメイン名をFQDNの最初の部分ではないように意図的に作成しました。したがって、私の場合、FQDNはtest.kirkdev.localです(ユーザーdnの例は "CN = George Washington、CN = Users、DC = test、DC = kirkdev、DC = local")が、netbiosドメイン名はkirkdevです。
カークLiemohn

Windowsを使用しdsquery computer OU=OU,OU=You,OU=Need,DC=local.domain -o rdnている場合、NetBIOS名を引用符で囲んで、必要なものを提供します。相対であるため、完全なパスを取得する必要はありません。ただし、これがOPに役立つかどうかはわかりません。彼はLDAPについて尋ねたので、これは純粋なLDAPの答えではありません。
songei2f

@alharakaはコメントに感謝しますが、MS以外のコンピューターからADを照会しています。潜在的に対処できますが、これをLDAPクエリの一部にしたいのです。dsqueryはWindows Serverのコマンドラインツールのようです。
カークリエモン

1
申し訳ありませんが、これは間違っています。最上位のドメインコンポーネント(例:dc = mydomain)とドメインのNetBIOS名の間にまったく関係はありません。彼らが同意したのは、よくある偶然です。
ブライアンデズモンド

0

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

答えてくれてありがとう。しかし、Windows以外のマシンから、理想的にはLDAPクエリを通じてこれを行う必要があります。
カークLiemohn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.