タイトル通り。MSDNにサンプル載ってるから、まーそのままなんですが。。。

//参照にも追加しないとダメ
using System.DirectoryServices;

public bool authLdap(string domain, string username, string pwd)
{
	string lserver = @"LDAP://server.domain.hoge.co.jp";//port:389
	string domainAndUsername = domain + @"\" + username;
	try
	{
	    DirectoryEntry entry = new DirectoryEntry(lserver, domainAndUsername, pwd);
	    //認証しくじるとここで例外が出る。
	    object obj = entry.NativeObject;
	    
	    DirectorySearcher search = new DirectorySearcher(entry);
	    search.Filter = "(SAMAccountName=" + username + ")";
	    SearchResult result = search.FindOne();
	    if (null == result)
	    {
	        return false;
	    }
	}
	catch (Exception ex)
	{
	    Console.WriteLine(ex.Message);
	    return false;
	}
	return true;
}

属性取りたいときはSearchResultのとこで↓の感じ。

DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("sAMAccountName");//ID
search.PropertiesToLoad.Add("sn");//氏名
search.PropertiesToLoad.Add("displayName");//表示名
search.PropertiesToLoad.Add("givenName");//名前
search.PropertiesToLoad.Add("initials");//イニシャル
search.PropertiesToLoad.Add("description");//説明
search.PropertiesToLoad.Add("mail");//メール
search.PropertiesToLoad.Add("company");//会社名
search.PropertiesToLoad.Add("department");//所属
search.PropertiesToLoad.Add("memberOf");//所属の色々

SearchResult result = search.FindOne();
if (null == result)
{
    return false;
}
//例えばメールアドレスが欲しいとき
if(prm.Properties["mail"].Count > 0)
{
    result = prm.Properties["mail"][0].ToString();
}

で、なんか自分、すごい勘違いしてると思うんだけど、他の言語だと接続用(読み取り用)のアカウントと認証したいユーザって別で書いてると思うのです。なぜだか.netだと、認証したいアカウントだけでやっちゃう。多分他の言語でも接続用と認証したいアカウント同じにすれば同じことなんだろうけど、なんか釈然としない。

.netはこういうもんなのかしら。。。出来れば接続用は分けたいのですが。。。