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;
}
誰でも問題を見て、正しい方向に向けることができますか?
免責事項:このコードは 単一の完全一致 を検索しないため、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();
あなたたちは一生懸命働いています:
// Look up the current user's email address
string eMail = UserPrincipal.Current.EmailAddress;
以下の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
フィルターを忘れました。
FindOneを呼び出す前にこれを追加してみてください。
search.Filter = String.Format("(sAMAccountName={0})", account);
また、(保存済み、ユーザー入力、現在のID)からユーザー名をどこから引き出しますか?ユーザー名は簡単に変更(名前を変更)できます-一方、SID/WindowsログオンIDは変更されません-したがって、可能であれば、および/または設計上必要な場合は、samaccountnameではなく、SIDによるフィルター/検索を実行することをお勧めします。 ..
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;
これはどうですか
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;
}
}
pdate:fredrickはそれを釘付けしました...
ヤコブは正しいです。検索をフィルタリングする必要があります。必要に応じて、あらゆる種類のand
sおよびor
sも実行できますが、sAMAccountName
で十分だと思います。レジストリのようにADを歩くことができるADSIツール(私が考えるリソースキットに含まれています)を起動することができます。プロパティを調べるのに最適です。次に、ユーザーを見つけ、必要な小道具(この場合はメール)とそれが何であるかを調べますprimary key
is-sAMAccountName
は適切ですが、ノードタイプでフィルタリングすることもできます。
私はMacを使用しているので確認できませんが、ADの各ノードにはタイプがあり、それをフィルターに追加できます。私はそれがこのように見えると思います:
((sAMAccountName=bob) & (type=User))
もう一度確認してください-type = userではなく、それと同様のものです。