2011-01-29 5 views
2

PrincipalContextを使用してActive Directoryサービス経由でドメインコンポーネントを検索しようとしています。PrincipalContextからドメインコンポーネントを検索

私は非常にいくつかのパラメータを使用してPrincipalContextを作成しました:

PrincipalContext theContext = new PrincipalContext(ContextType.Domain); 

theContextが正しく戻って来ています。私はそれについて多くのことを照会し、期待される結果を得ることができます。しかし、私が本当にやりたいことと等価である:

Console.WriteLine("Domain Component: " + theContext.Container); 

は、MSDNによると、これだけでは「コンストラクタでコンテナのパラメータで指定した値を取得します。」私は何も通らなかったので、私は何も戻ってきていない。

しかし理論的なコンテナには、使用または作成する必要のある識別名に必要なドメインコンポーネントがあります。私はそこにいることがわかっている組織単位で新しいユーザーを作成しようとしています。しかし、私はドメインコンポーネントを知らないので、私は識別名を作成することはできません。私は相対的な道筋を見ていません。

私が考えた最良の選択肢は、任意のユーザーの検索を行い、その識別名を取得して "dc"部分を切り落とすことです。

var searchUser = new UserPrincipal(theContext); 
var searcher = new PrincipalSearcher(searchUser); 
Principal aUser = searcher.FindOne(); 
if (aUser != null) 
{ 
    string dn = aUser.DistinguishedName; 
    Console.WriteLine(dn.Substring(dn.IndexOf("dc=", StringComparison.InvariantCultureIgnoreCase))); 

} 

これは貧弱なハックのようです。あまりにも多くが間違って行くことができる私はもっ​​と良いものがあることを望んでいる。誰にもアイデアはありますか?

答えて

4

名前付けコンテキストを取得するには、RootDSEにバインドする必要があります。 RootDSEは、ディレクトリサーバーに関する多くの有用な情報を提供します。これらのうち、defaultNamingContext属性には、ドメインの識別名が格納されます。

現在ログオンしているユーザーのドメインのRootDSEにバインドするには、serverless bindingを使用します。現在ログオンしているユーザーのドメインのでrootDSEにバインドサーバーレスを行うには、結合文字列はここでは、この

LDAP://RootDSE 

ようになっているはずですが、あなたがそれをやったDirectoryEntry

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"); 
string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string; 
+0

使用してそれを得ることができる方法です。ありがとう。 –

関連する問題