web-dev-qa-db-ja.com

.NetのLDAPディレクトリエントリ-OU = Usersでは機能しません

私は次のコード(C#)を持っています:

(調整元: http://www.eggheadcafe.com/conversation.aspx?messageid=31766061&threadid=3176605

DirectorySearcher dseSearcher = new DirectorySearcher();

string rootDSE = dseSearcher.SearchRoot.Path;
DirectoryEntry rootDE = new DirectoryEntry(rootDSE);

string userDSE = rootDSE.Insert(7, "OU=Users,");
DirectoryEntry userDE = new DirectoryEntry(userDSE);

rootDSEは正しく作成されますが、ユーザーuserDSEは使用できず、使用しようとすると「サーバーにそのようなオブジェクトはありません」という例外がスローされます。

LDAP文字列は次のとおりです。

ルート:LDAP:// DC = company、DC = local

ユーザー:LDAP:// OU = Users、DC = company、DC = local

私は管理者としてVistaで実行していますが、XP(管理者)でも機能するためにこれが必要です。

私はLDAPとディレクトリ管理に慣れていないので、ここで暗闇の中でつまずきます。何かご意見は?また、リンクする記事で、すべてがどのように機能するかについての洞察を得ることができれば幸いです。

7
Tristan

私がテストとして最初に試みることは、次のようなディレクトリエントリを作成するときに、目的のパスをハードコーディングすることです。

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=company,DC=local");

これがActiveDirectoryの実際のパスであるかどうかは、すぐにわかります。 ADがどのように表示されるかわからないため、これが有効なパスであるかどうかはわかりません。 ActiveDirectoryユーザーとコンピューターMMCプラグイン、このパスが正しい場合は、ルートドメインと、ルートの下にユーザーと呼ばれるOUフォルダーが必要です。

パスはADで逆方向に生成されるため、Usersフォルダーがルートから離れた別のOUの下にある場合は、

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,OU=<first OU folder>,DC=company,DC=local");

したがって、ADスキーマは次のようになります。

 Root 
 |
 --><first OU folder>
     |
     -->Users

.NETでActiveDirectoryを管理する方法に関するすばらしい記事:

ハウツー:(ほぼ)Active DirectoryのすべてをC#経由で実行する

また、.Net 3.5 Frameworkで提供されているSystem.DirectoryServices、System.DirectoryServices.ActiveDirectory、およびSystem.DirectoryServices.AccountManagement名前空間を調査することもできます。 System.DirectoryServicesとActiveDirctory名前空間は.Net1.1で利用可能であり、AccountManagementは.Net3.5で導入されたと思います。

Microsoftドキュメント-名前空間の使用方法に関する多くの優れたリンク

補遺:

ADで実際にユーザーを見つけるには、次のようにします。

 DirectoryEntry de = new DirectoryEntry();
 de.Path = "LDAP://DC=company,DC=local";
 de.AuthenticationType = AuthenticationTypes.Secure;

 DirectorySearcher deSearch = new DirectorySearcher();

 deSearch.SearchRoot = de;
 deSearch.Filter = "(&(objectClass=user) (cn=" + username + "))";

 SearchResult result = deSearch.FindOne();

 if (result != null)
 {
     DirectoryEntry deUser = new DirectoryEntry(result.Path);
     ... do what ever you need to the deUser
     deUser.Close();
 }
13
Scott Lance

これはばかげてばかげているように見えるかもしれませんが、Active Directoryのデフォルトのツリー設定はOU = Users、dc = domain、dc = comではなく cn= Users、dc = domain、dc = com(ユーザーのOU =ではなくCN =に注意してください。

ADのコンテナオブジェクト(cnのobjectClass)はグループポリシーの受信者になることができないため、ばかげているように見えますが、私にはわからない理由で、これがデフォルトです。 (実際、私は理解しています。それは、CNの包含がOUよりもNTドメインに似ているためです)

初めてADにLDAPバインド/認証を試みたときに、私が出会うほとんどすべての人を取得します。

6
geoffc

Geoffcが正しく述べたように、Active Directoryでは、ドメインの下の「ユーザー」は組織単位オブジェクトではなくコンテナオブジェクトです。これにより、LDAPパスがまったく異なり、エラーメッセージが表示されます。

次のコードを試して、問題が解決する場合は投稿してください。

// Replace the "company" and "com" with actual domain values...
DirectoryEntry de = new DirectoryEntry("LDAP://CN=Users,DC=company,DC=com");
DirectorySearcher deSearch = new DirectorySearcher();
deSearch.SearchRoot = de;

// Set your other search params here
2
Joshua