2011-01-12 11 views
4

GetDomainを使用する前にActiveDirectoryでドメインが利用可能かどうかを調べる方法はありますか?ユーザーがドメインを自分で追加できるようにするアプリがあり、無効なドメインに入るとエラーが発生するはずです。今は、以下の例外をキャッチすることで処理されますが、無効なドメインに入るユーザーは例外的なことはほとんどありません。例外は、特にIPアドレスが入力された場合には、 。これにはより良い解決策がありますか?ActiveDirectory:ドメインが利用可能かどうかを調べるには?

public Domain RegisterUserDirectory(string domainId) { 
    DirectoryContext context = new DirectoryContext(DirectoryContextType.Domain, domainId); 

    System.DirectoryServices.ActiveDirectory.Domain domain; 
    try { 
    domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(context); 
    } 
    catch (ActiveDirectoryNotFoundException adne) { 
    // handle 
    } 
    catch (Exception e) { 
    Log.Warning("Failed to contact domain {0}: {1}", domainId, e.Message); 
    throw; 
    } 

    ... 
    ... 
} 
+0

私はこれが**最良の方法ですと思っています... –

答えて

3

残念ながら私は本当の他の方法はないと思います。ちょうどあなたがIPアドレスが到達可能であることを確認する方法について考えてみてください。あなたが行うことができるのは、接続を試みるか、またはping要求を送信することだけです。この後、誰かが答えてくれるのを待つだけで、接続が遅くなる可能性があるため、タイムアウトが高く、常に待たなければなりません。

ユーザーの操作性を向上させるためにできることは、このジョブを別のトレッド(またはバックグラウンドワーカー)に配置して、GUIが依然として反応し、ユーザーに進行状況やマーキーバーが表示されるようにすることです。次に、このスレッドを中止するだけで、ユーザーが接続試行をキャンセルする可能性を追加することもできます。

これはこれ以上速くはありませんが、ユーザーの反応が良くなり、最後に速く感じます。

5

私が考えることができる唯一の他の選択肢は、ドメインを列挙するためにフォレストを使用することです。すなわち

var myDomain = Domain.GetCurrentDomain(); //or .GetComputerDomain(); 
var forestDomains = myDomain.Forest.Domains; 

これは、すべてのドメインが同じフォレストにあると仮定しています。おそらく、各ドメイン.Nameのプロパティに対してテストして、domainIdと入力したユーザーをこのコレクションに対してテストする必要があります。

+0

これは私がやりたかったのですが、コレクションにforeachをしてドメインがあるかどうか確認する必要がありますか?検索方法はありますか? –

+1

@RonenFestinger:私は、検索/検索の方法、[MSDNドキュメントのDomainCollection](http://msdn.microsoft.com/en-us/library/system.directoryservices.activedirectory.domaincollection(v) = vs.110).aspx)には言及していません。また、どのドメインを確認する必要があるかわからない(つまり、探しているドメイン名が[email protected]形式であるか、FQDN \ user形式である可能性があります)。 NetBIOS名と2000年以降の名前は必ずしも一致しません)。 – Grhm

1

あなたには良い答えが必要です。 Active Directoryは、すべての信頼できるドメインに関する情報を格納します。したがって、グローバルカタログを参照するだけで、実際にドメインコントローラにバインドすることなく、信頼できるドメイン情報をすべて見つけることができます。

ただし、ドメイン情報がActive Directoryに存在する場合でも、バインドできるということではありません。バインドする権限がないか、環境内のファイアウォール設定によって一部のドメインへのアクセスがブロックされている可能性があります。

私はここで次のことを仮定しています。

  1. ソフトウェアを実行しているコンピュータは、すでにドメインに参加しています。ソフトウェアを実行する際に
  2. あなたは、ドメインユーザーとしてログインしている
  3. あなたはただ1つの森林を持っていますが、森林は、ドメインの多くを含んでいるあなたは、あなたの森の中でグローバルカタログを持って
  4. (非常に多くの場合、あなたが持っています)
  5. あなたがDNSドメイン名ではなく、NETBIOSドメイン名

あなたはドメインがあなたの現在のフォレストに存在するかどうかを確認するには、次のコードを使用することができますを入力しています。はいの場合は、引き続きDomain.GetDomain(コンテキスト)を呼び出して、Domainオブジェクトを取得します。何らかの理由でバインドできない場合は、タイムアウトが発生するのを待つ必要があります。

private bool DomainExist(string domain) 
{ 
    HashSet<string> domains = new HashSet<string>(); 
    foreach (Domain d in Forest.GetCurrentForest().Domains) 
    { 
     domains.Add(d.Name.ToLower()); 
    } 

    return domains.Contains(domain.ToLower()); 
} 
3

ここでは、フォレストを使用せずに、私はそれを行う方法です。一部の読み取り専用サーバーではForestクラスを使用する際に問題が発生するため、通常のDomainExistsメソッドで例外が発生した場合は、代わりにこのメソッドを試してみます。

public static bool DomainExistsNoForests(string domain, string server) 
{ 
    try { 
    DirectoryContext directoryContext = new DirectoryContext(DirectoryContextType.DirectoryServer, server); 
    Domain d = Domain.GetDomain(directoryContext); 
    if (d.Name.Trim().Equals(domain.Trim(), StringComparison.CurrentCultureIgnoreCase)) return true; 
    return false; 
    } 
    catch (Exception e) { 
    return false; 
    } 
} 

これは、投稿した方法よりはるかに高速です。このコードはドメインの解決を試みませんが、使用しているディレクトリサーバーを知る必要があります。

また、null引数をチェックするためのコードもありますが、この返信用にトリムしました。

チャールズ。

関連する問題