2011-08-01 10 views
0

この問題に関連してオンラインで多くの資料が存在することを認識していますが、この特定の問題についてはあまりありません。Active Directoryから特定のユーザー(現在のユーザーではない)のドメイン名を取得する

私はユーザー名だけでなくユーザーのドメイン名も取得するために、C#でActive Directoryに照会することを検討しています。私は現在のユーザーまたは現在のセッションのドメイン名を探していません。

この理由は、多くのユーザーが複数のドメインに所属し、U.Iを介してユーザーの資格情報を操作している管理者と同じ名前にはなりません。

管理者がユーザーを追加するときに、ユーザーのドメイン名を確認し、ユーザー名の前にそのユーザー名を入力する必要があります。 DOMAIN \ username 追加されたユーザーのドメイン名は、必ずしも以前に追加されたユーザーと同じではない可能性があります。

+0

あなたが照会したいものと返す必要があるものは、私にはあまり明確ではありません。管理者がユーザーを追加したときに、どのドメインをユーザーが追加しているのかわからない場合はどうなりますか? – Tsabo

+0

ご質問ありがとうございます。 – Dave

+0

私は管理者によって追加された特定のユーザーのドメインを返すようにしています。管理者はユーザーのドメインを知っているはずですが、ユーザー名とともにドメイン名を自動的に追加することで人為的なエラーや時間を防ぐことができます。ありがとう – Dave

答えて

0

解決策はLDAPを使用することです。これにより、異なるドメインに接続して照会できるようになります。フルネームはuserprincipal(例:[email protected])に保存されます。

特定のドメイン名に対しても、どのツリーに接続するかを知る必要があります。また、ドメインがフォレスト内にない限り、純粋にユーザー名で検索している場合は、ドメインユーザー名が重複する可能性があります。

ドメインがフォレスト内にある場合は、グローバルカタログを使用してフォレストルートを検索できるショートカットがあります。その後、すべての子ドメインを検索します。ただし、検索するツリーのサイズに応じて、時間がかかることがあります。

編集

これらは私が使用したLDAPをチェックするためのいくつかのコードの断片です。あなたは何かに役立つものを組み込むことができるはずです。

LdapConnection connection = new LdapConnection(new LdapDirectoryIdentifier(_Parser.Host, _Parser.Port)); 
connection.Bind(new System.Net.NetworkCredential(_Parser.Username, _Parser.Password)); 

xは---

request = new SearchRequest(); 
request.Filter = query; 
request.Scope = SearchScope.Subtree; 
request.DistinguishedName = _Parser.SearchBase; 

response = (SearchResponse)connection2.SendRequest(request); 

をチョキ応答は、あなたが、あなたが興味のある項目を見つけるために列挙することができ、結果のコレクションが含まれています。

LDAPクエリは、逆ポーランドを使用しています表記&あなたが欲しいと思うのは(samaccountname=<your value here>)です。探しているユーザー名に置き換えてください。あなたは値を引用する必要はありません。

_Parser.SearchBaseを、検索を開始するオブジェクトのdnである文字列に置き換えます。ドメイン名がsomedomain.comの場合は、おそらくdc = somedomain、dc = comのようになります。 ホストは、接続するADサーバーの名前にする必要があります。ポートは3268をグローバルカタログとして使用してください。また、読み取り専用ですみ、すべてのパーティションがあるためです。接続に使用するユーザー名を[email protected]として指定します。

userprincipalnameという名前の属性を探します。 msdnのドキュメントは、結果オブジェクトの読み方についての助けになるはずです。

サイモン

+0

こんにちは@サイモン、応答のおかげで。あなたの答えは私には意味がありますが、ちょっとした追加情報があればMembershipUserCollectionのgetAllUsers()メソッドを使用しています。あなたの解決策はまだこれに当てはまりますか?管理画面からユーザーを追加すると、ユーザー名のドメインを確認し、ユーザー名とバックスラッシュで連結します。 DOMAIN + \ +ユーザー名。ありがとう! – Dave

+0

曖昧な場合は、MembershipUserCollectionオブジェクトはSystem.Web.Security.MembershipUserCollectionクラスから取得します。再度、感謝します。 – Dave

+0

また、userprincipal([email protected])に言及しました。この値をLDAP経由で返す方法はありますか?もし私がそれを得ることができれば、そこからドメイン名を解析することができますか?ありがとう。 – Dave

1

だからuserPrincipalNameのドメインの最初の成分であるドメインのNetBIOS名(例えば[email protected]はCONTOSO \ブライアンある)純粋に偶然です。彼らがADで一致しなければならない理由は絶対にありません。

ユーザーのドメインのnetBIOS名を取得する場所は、そのドメインのcrossRefオブジェクトからのものです。これを行うには、ユーザーのdistinguishedName(DC =で始まる文字列の部分)のドメイン部分を取得し、次にこのようなフィルタを使用して、構成NCで一致するcrossRefを検索する必要があります。(&(objectClass = crossRef)(ncName =))。次に、nETBIOSName属性を検査できます。

設定NCのDNを取得して検索を開始するには、LDAP:// RootDSEにconfigurationNamingContext属性を問い合わせます。

関連する問題