6

私は認証のために System.DirectoryServices.AccountManagement を Web アプリケーションに実装し、指定されたユーザー名でユーザー (UserPrincipal) を見つけました。ただし、employeeID のみを指定して AD アカウントを取得する必要がある場合がいくつかあります。AccountManagement で employeeID を指定して UserPrincipal (または単に sAMAccountName) を取得する良い方法はありますか?

現在、ユーザー名でユーザーを取得するためにこれが機能しています:

PrincipalContext adAuth = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);

//get user
UserPrincipal usr = UserPrincipal.FindByIdentity(adAuth, username);

私は検索してきましたが、これができるかできないかを確認するための答えが見つからないようです。AccountManagement でできない場合、employeeID を指定して sAMAccountName を取得する最善の方法は何ですか?

4

2 に答える 2

12

System.DirectoryServices.AccountManagement 名前空間の外に出る必要はありません。

UserPrincipal searchTemplate = new UserPrincipal(adAuth);
searchTemplate.EmployeeID = "employeeID";
PrincipalSearcher ps = new PrincipalSearcher(searchTemplate);

UserPrincipal user = (UserPrincipal)ps.FindOne();

この例では、ユーザーが見つからない場合、ユーザー オブジェクトは null になります。UserPrinicipal オブジェクトのコレクションを検索する場合は、PrincipalSearcher (ps) オブジェクトで FindAll メソッドを使用できます。

また、FindOne メソッドは Principal オブジェクトを返しますが、これは実際には UserPrincipal であり、UserPrincipal は検索フィルターの一部であるため、そのように処理 (キャスト) する必要があることがわかっています。

于 2015-12-18T00:33:22.717 に答える
2

そのため、以下のように System.DirectoryServices を使用する方法を見つけましたが、かなり長いようです。

string username = "";

DirectoryEntry entry = new DirectoryEntry(_path);

//search for a DirectoryEntry based on employeeID
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(employeeID=" + empID + ")";

//username
search.PropertiesToLoad.Add("sAMAccountName");

SearchResult result = search.FindOne();

//get sAMAccountName property
username = result.Properties["sAMAccountName"][0].ToString();

もちろん、これを他の属性に使用することもできますが、AccountManagement で厳密に型指定された属性が非常に気に入っています。

于 2014-05-28T17:44:27.287 に答える