12

今朝、サーバー上に Active Directory オブジェクトが存在するかどうかを確認できる優れたメソッド ( DirectoryEntry.Exists ) を発見しました。だから私は簡単に試しました:

if (DirectoryEntry.Exists(path)) {}

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

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

AD サーバーでコードを認証する可能性を与える他のオプションはありますか? または、オブジェクトの存在を確認しますか?

4

6 に答える 6

17

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

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; 
}
于 2010-11-26T13:30:23.847 に答える
2

これを行う方法はありません。うまくいけば解決するために、接続の問題を書きました。

DirectoryEntry.Exists が資格情報を受け入れない

于 2014-03-20T16:36:36.990 に答える
1

ここでは、C# での偽装について読むことができます。

于 2010-11-26T11:29:44.777 に答える
1

質問への答え:不可能です。

最後に、認証情報を指定して、識別名で DirectoryEntry を取得する独自のメソッドを記述します。存在する場合と存在しない場合の両方で、DirectoryEntry のインスタンスを取得しました。返されたオブジェクトが有効かどうかを確認するには、単純な try...catch を実行して、例外が発生するかどうかを確認します。もしそうなら、それは無効です。

厄介なチェックですが、機能します。残念ながら、デフォルトの .net メソッド DirectoryEntry.Exists は、DirectoryEntry コンストラクターと同様に資格情報を提供するためのオーバーロードを提供しません...

于 2010-11-26T12:42:58.627 に答える
0

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

これは役に立つかもしれません (AD コンテキストでの偽装について説明します): http://www.codeproject.com/KB/system/everythingInAD.aspx

ところで、必要なものすべてにアクセスできるユーザーの資格情報を既に持っている場合、そのユーザー (/runas など) のプロセスだけではないのはなぜですか?

于 2010-11-26T10:07:40.380 に答える