web-dev-qa-db-ja.com

Active Directoryからユーザーの電子メールアドレスを取得する方法

ADでユーザーのメールアドレスを取得しようとしていますが、成功しません。

String account = userAccount.Replace(@"Domain\", "");
DirectoryEntry entry = new DirectoryEntry();

try {
    DirectorySearcher search = new DirectorySearcher(entry);

    search.PropertiesToLoad.Add("mail");  // e-mail addressead

    SearchResult result = search.FindOne();
    if (result != null) {
        return result.Properties["mail"][0].ToString();
    } else {
        return "Unknown User";
    }
} catch (Exception ex) {
    return ex.Message;
}

誰でも問題を見て、正しい方向に向けることができますか?

23
user95440

免責事項:このコードは 単一の完全一致 を検索しないため、domain\j_doe返される場合がありますdomain\j_doe_from_external_departmentの電子メールアドレス(このような同様の名前のアカウントも存在する場合)。そのような動作が望ましくない場合は、次に使用する anr の代わりに samAccountName フィルターを使用するか、または results をさらにフィルターします。

私はこのコードを正常に使用しました(「アカウント」はドメインなしのユーザーログオン名です(domain\account):

// get a DirectorySearcher object
DirectorySearcher search = new DirectorySearcher(entry);

// specify the search filter
search.Filter = "(&(objectClass=user)(anr=" + account + "))";

// specify which property values to return in the search
search.PropertiesToLoad.Add("givenName");   // first name
search.PropertiesToLoad.Add("sn");          // last name
search.PropertiesToLoad.Add("mail");        // smtp mail address

// perform the search
SearchResult result = search.FindOne();
44
Fredrik Mörk

あなたたちは一生懸命働いています:

// Look up the current user's email address
string eMail =  UserPrincipal.Current.EmailAddress;
13
SMerrill8

以下のGetUserEmailメソッドを試すことができます。 MVCでログインしているユーザーのメールアドレスを探している場合は、GetUserEmail()関数をser.Identity.Nameで呼び出します。

using System.DirectoryServices;
using System.Linq;

public string GetUserEmail(string UserId)
    {

        var searcher = new DirectorySearcher("LDAP://" + UserId.Split('\\').First().ToLower())
        {
            Filter = "(&(ObjectClass=person)(sAMAccountName=" + UserId.Split('\\').Last().ToLower() + "))"
        };

        var result = searcher.FindOne();
        if (result == null)
            return string.Empty;

        return result.Properties["mail"][0].ToString();

    }

GetUserEmail(User.Identity.Name) //Get Logged in user email address
3
Kaarthikeyan

フィルターを忘れました。

FindOneを呼び出す前にこれを追加してみてください。

search.Filter = String.Format("(sAMAccountName={0})", account);
2

また、(保存済み、ユーザー入力、現在のID)からユーザー名をどこから引き出しますか?ユーザー名は簡単に変更(名前を変更)できます-一方、SID/WindowsログオンIDは変更されません-したがって、可能であれば、および/または設計上必要な場合は、samaccountnameではなく、SIDによるフィルター/検索を実行することをお勧めします。 ..

1
Oskar Duveborn

System.DirectoryServices.AccountManagementの参照を追加し、これと同じ参照をusingステートメントに含める必要があります。これで、現在のユーザーのログイン詳細にアクセスできるようになります。以下にリストされているように、電子メールアドレスが含まれています。

string loginname = Environment.UserName;
string firstname = UserPrincipal.Current.GivenName;
string lastname = UserPrincipal.Current.Surname;
string name = UserPrincipal.Current.Name;
string eMail = UserPrincipal.Current.EmailAddress;
0
A. Lartey

これはどうですか

public string GetEmailFromSamAccountName(string samAccountName, string domain="YOURCOMPANY")
{
   using (var principalContext = new PrincipalContext(ContextType.Domain, domain))
   {
      var userPrincipal = UserPrincipal.FindByIdentity(principalContext, samAccountName);
      return userPrincipal.EmailAddress;
   }
}
0
Muflix

pdate:fredrickはそれを釘付けしました...

ヤコブは正しいです。検索をフィルタリングする必要があります。必要に応じて、あらゆる種類のandsおよびorsも実行できますが、sAMAccountNameで十分だと思います。レジストリのようにADを歩くことができるADSIツール(私が考えるリソースキットに含まれています)を起動することができます。プロパティを調べるのに最適です。次に、ユーザーを見つけ、必要な小道具(この場合はメール)とそれが何であるかを調べますprimary key is-sAMAccountNameは適切ですが、ノードタイプでフィルタリングすることもできます。

私はMacを使用しているので確認できませんが、ADの各ノードにはタイプがあり、それをフィルターに追加できます。私はそれがこのように見えると思います:

((sAMAccountName=bob) & (type=User))

もう一度確認してください-type = userではなく、それと同様のものです。

0
Nic Wise