2010-11-26 10 views
8

今朝私は、Active Directoryオブジェクトがサーバー上に存在するかどうかをチェックできる、すばらしいメソッド(DirectoryEntry.Exists)を発見しました。だから、私は単純な試みをしました:DirectoryEntry.Existsに資格情報を提供する方法

if (DirectoryEntry.Exists(path)) {} 

もちろん、資格情報を提供するためのオーバーロードはありません。資格情報が提供されていない場合、私はこの例外を取得します。

ログオン失敗:不明なユーザー名または 不正なパスワードです。 (System.DirectoryServices.DirectoryServicesCOMException)

は私のADサーバでの私のコードを認証する可能性を与え、他の選択肢はありますか?またはオブジェクトの存在を確認するには?

答えて

13

この場合、あなたが言ったように、あなたは、静的メソッドが存在する使用することはできません。

DirectoryEntry directoryEntry = new DirectoryEntry(path); 
directoryEntry.Username = "username"; 
directoryEntry.Password = "password"; 

bool exists = false; 
// Validate with Guid 
try 
{ 
    var tmp = directoryEntry.Guid; 
    exists = true; 
} 
catch (COMException) 
{ 
    exists = false; 
} 
+0

これは私が推奨する解決策ですが、このプロパティは静かではないようです。http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.username.aspx –

+0

Oh私は気にはならない。うん、あなたは新しいDirectoryEntryをinstanciateする必要があります。編集されました。 – JoeBilly

+0

素敵なコードサンプルをありがとう。明らかにそれが唯一の方法です。それはデフォルトでは不可能な哀れみです。ネットの方法ですが、少なくとも素晴らしい回避策があります。 –

0

プロセスを実行したユーザーにDirectoryEntry.Existsを呼び出す権限がない場合は、偽装を使用できます。

これは役立つかもしれないが(ADコンテキストで偽装を論じ):http://www.codeproject.com/KB/system/everythingInAD.aspx

をところで、あなたはすでにそのユーザーとあなたが必要なものがすべて、なぜだけではなく、プロセスへのアクセス権を持つユーザーの資格情報を持っている場合(たとえば、/runas)?ここで

+0

ありがとうございます。私の問題に降りかかる解決策も私のようには見つけられません。 Runasは私の現在のプロジェクトでは本当に選択肢ではありません...偽装はありませんが、これまでのところ最高のようです。 –

1

そこで質問に答える:不可能。

最後に、独自のメソッドを作成して、識別名でDirectoryEntryを取得し、資格情報を指定します。存在/不在の両方のケースで、私はDirectoryEntryのインスタンスを得ました。それが有効なオブジェクトであるかどうかを調べるために、単純なtry ... catchを実行して例外が発生するかどうかを確認します。もしそうなら、それは無効です。

厄介なチェックですが動作します。残念デフォルトの.NETメソッドDirectoryEntry.ExistsだけのDirectoryEntryコンストラクタなどの資格情報を提供するために過負荷を提供していません...

関連する問題