web-dev-qa-db-ja.com

LDAPのクエリ

これまでLDAPを扱ったことがないので、少し迷っています。 LDAPソースに接続して特定の属性を見つけて変更する必要があります。プログラムへの入力は、ユーザーのリストを含むCSVファイルです。このプログラムは、CSVファイルからUIDを読み取り、LDAP内のレコードを見つけ、特定の属性を置き換えることになっています。これを行う方法がわかりません。誰かが私を正しい方向に向けることができますか?

32
Graeme

@KenLほとんど私はそこに着いた。また、動作させるために DirectoryEntry のAuthenticationTypeを設定する必要がありました。また、ワイルドカードの使用方法にも注意してください( Kleene Stars )。

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://some.ldap.server.com");
rootEntry.AuthenticationType = AuthenticationTypes.None; //Or whatever it need be
DirectorySearcher searcher = new DirectorySearcher(rootEntry);
var queryFormat = "(&(objectClass=user)(objectCategory=person)(|(SAMAccountName=*{0}*)(cn=*{0}*)(gn=*{0}*)(sn=*{0}*)(email=*{0}*)))";
searcher.Filter = string.Format(queryFormat, searchString);
foreach(SearchResult result in searcher.FindAll()) 
{
    Console.WriteLine("account name: {0}", result.Properties["samaccountname"].Count > 0 ? result.Properties["samaccountname"][0] : string.Empty);
    Console.WriteLine("common name: {0}", result.Properties["cn"].Count > 0 ? result.Properties["cn"][0] : string.Empty);
}
23
rstackhouse

応答の最初の要素、ADSIを使用(旧式)

C#を使用してActive Directoryでほぼすべてを(ADSIを使用して)行う方法

応答の2番目の要素、. NET 3.5以降Microsoftは「Principal」と「AccountManagement '。

C#を使用してActive Directoryでほとんどすべてを(AccountManagementで)行う方法

応答の3番目の要素System.DirectoryServices.Protocols(S.DS.P)で低レベル(ネイティブLDAP)プロトコルを使用できます。

Remark:ネイティブコードからActive Directoryに問い合わせる方法に興味がある場合は、RFC 1823に記載されているLDAP C-Binding APIを参照してください。 Microsoftがサポートしています。 MS(Lightweight Directory Access Protocol(LDAP))戦略 を参照してください。 Lightweight Directory Access ProtocolのMicrosoft API の使用マニュアルとリファレンスマニュアルがあります。

20
JPBlanc

コードに関しては、あなたが思っているよりもずっと簡単です。ディレクトリへの接続を作成し、サーチャーを設定してから、プロパティ名で検索する必要があります。

DirectoryEntry entry = new DirectoryEntry("LDAP://MyDomain.com");
DirectorySearcher dSearch = new DirectorySearcher(entry);
dSearch.Filter = "(&(objectCategory=person)(objectClass=user)(" + SType + "=" + Name + "))";

STypeは名前の種類で、Nameは実際のユーザー名です

14
KenL