web-dev-qa-db-ja.com

C#で現在のユーザーのActive Directoryの詳細を取得する方法

Windows認証を使用するC#およびASP.Netアプリケーションで作業しています。

つまり、Web.configで:

<system.web>
    <authentication mode="Windows" />
</system.web>

Active Directoryから現在のユーザーの詳細(氏名、メールアドレスなど)を取得したい。


Windows 2000以前のユーザーのログイン名を取得できます(例:SOMEDOMAIN\someuser)を使用して

string username = HttpContext.Current.Request.ServerVariables["AUTH_USER"];

現在のログイン名(以前のWindows 2000ユーザーのログイン名ではなく)を使用して、ユーザーのLDAPクエリを作成しました。

DirectorySearcher adSearch = new DirectorySearcher(
        "([email protected])");
SearchResult adSearchResult = adSearch.FindOne();

ただし、W2K以前のログイン名を使用してユーザーをADで検索する方法、または '[email protected]'形式でログイン名を取得する方法がわかりません。

何か案は?

36
Sophia

「pre Windows 2000」の名前、つまりDOMAIN\SomeBodySomebody部分はsAMAccountNameとして知られています。

だから試してください:

using(DirectoryEntry de = new DirectoryEntry("LDAP://MyDomainController"))
{
   using(DirectorySearcher adSearch = new DirectorySearcher(de))
   {
     adSearch.Filter = "(sAMAccountName=someuser)";
     SearchResult adSearchResult = adSearch.FindOne();
   }
}

[email protected]はUserPrincipalNameですが、必須フィールドではありません。

52
Alan

アランはすでにあなたに正しい答えを与えました-sAMAccountNameを使用してユーザーをフィルタリングします。

DirectorySearcherの使用に関する推奨事項を追加します。1つまたは2つの情報だけが必要な場合は、DirectorySearcher"PropertiesToLoad"コレクションに追加します。

大きなユーザーオブジェクト全体を取得してから1つまたは2つのアイテムを選択する代わりに、必要なビットを正確に返します。

サンプル:

adSearch.PropertiesToLoad.Add("sn");  // surname = last name
adSearch.PropertiesToLoad.Add("givenName");  // given (or first) name
adSearch.PropertiesToLoad.Add("mail");  // e-mail addresse
adSearch.PropertiesToLoad.Add("telephoneNumber");  // phone number

これらは、指定する必要がある通常のAD/LDAPプロパティ名です。

44
marc_s

COMへの参照を追加する「アクティブDSタイプライブラリ」


            Int32 nameTypeNT4               = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4;
            Int32 nameTypeDN                = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_1779;
            Int32 nameTypeUserPrincipalName = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME;

            ActiveDs.NameTranslate nameTranslate = new ActiveDs.NameTranslate();

            // Convert NT name DOMAIN\User into AD distinguished name 
            // "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com"
            nameTranslate.Set(nameTypeNT4, ntUser);

            String distinguishedName = nameTranslate.Get(nameTypeDN);

            Console.WriteLine(distinguishedName);

            // Convert AD distinguished name "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com" 
            // into NT name DOMAIN\User
            ntUser = String.Empty;
            nameTranslate.Set(nameTypeDN, distinguishedName);
            ntUser = nameTranslate.Get(nameTypeNT4);
            Console.WriteLine(ntUser);

            // Convert NT name DOMAIN\User into AD UserPrincipalName [email protected]
            nameTranslate.Set(nameTypeNT4, ntUser);
            String userPrincipalName = nameTranslate.Get(nameTypeUserPrincipalName);

            Console.WriteLine(userPrincipalName);
11
Dmitri Kouminov

.NET 3.5 SP1 +を使用している場合、これを行うためのより良い方法は、

System.DirectoryServices.AccountManagement namespace.

人を見つけるためのメソッドがあり、必要なユーザー名形式でほとんど渡すことができ、必要な基本情報のほとんどを返します。より複雑なオブジェクトとプロパティの読み込みに関するヘルプが必要な場合は、 http://umanage.codeplex.com のソースコードを確認してください。

ブレント

4
Brent Pabst