Windows認証を使用するWebアプリケーションを作成していますが、次のようなものを使用してユーザーのログイン名を喜んで取得できます。
string login = User.Identity.Name.ToString();
しかし、ログイン名は必要ありません。DisplayName が必要です。もう数時間頭を叩いています...
Web アプリケーション経由で組織の AD にアクセスできますか?
Windows認証を使用するWebアプリケーションを作成していますが、次のようなものを使用してユーザーのログイン名を喜んで取得できます。
string login = User.Identity.Name.ToString();
しかし、ログイン名は必要ありません。DisplayName が必要です。もう数時間頭を叩いています...
Web アプリケーション経由で組織の AD にアクセスできますか?
これはどう:
private static string GetFullName()
{
try
{
DirectoryEntry de = new DirectoryEntry("WinNT://" + Environment.UserDomainName + "/" + Environment.UserName);
return de.Properties["displayName"].Value.ToString();
}
catch { return null; }
}
関連する質問を参照してください: Active Directory: ユーザー情報の取得
参照:方法: C#を介した (ほぼ) Active Directory のすべて、より具体的には「オブジェクトのプロパティを列挙する」セクションを参照してください。
ドメイン内のグループに接続するためのパスがある場合は、次のスニペットが役立つ場合があります。
GetUserProperty("<myaccount>", "DisplayName");
public static string GetUserProperty(string accountName, string propertyName)
{
DirectoryEntry entry = new DirectoryEntry();
// "LDAP://CN=<group name>, CN =<Users>, DC=<domain component>, DC=<domain component>,..."
entry.Path = "LDAP://...";
entry.AuthenticationType = AuthenticationTypes.Secure;
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + accountName + ")";
search.PropertiesToLoad.Add(propertyName);
SearchResultCollection results = search.FindAll();
if (results != null && results.Count > 0)
{
return results[0].Properties[propertyName][0].ToString();
}
else
{
return "Unknown User";
}
}
誰かが気になる場合に備えて、私はこれをクラックすることができました:
/// This is some imaginary code to show you how to use it
Session["USER"] = User.Identity.Name.ToString();
Session["LOGIN"] = RemoveDomainPrefix(User.Identity.Name.ToString()); // not a real function :D
string ldappath = "LDAP://your_ldap_path";
// "LDAP://CN=<group name>, CN =<Users>, DC=<domain component>, DC=<domain component>,..."
Session["cn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "cn");
Session["displayName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "displayName");
Session["mail"] = GetAttribute(ldappath, (string)Session["LOGIN"], "mail");
Session["givenName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "givenName");
Session["sn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "sn");
/// working code
public static string GetAttribute(string ldappath, string sAMAccountName, string attribute)
{
string OUT = string.Empty;
try
{
DirectoryEntry de = new DirectoryEntry(ldappath);
DirectorySearcher ds = new DirectorySearcher(de);
ds.Filter = "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" + sAMAccountName + "))";
SearchResultCollection results = ds.FindAll();
foreach (SearchResult result in results)
{
OUT = GetProperty(result, attribute);
}
}
catch (Exception t)
{
// System.Diagnostics.Debug.WriteLine(t.Message);
}
return (OUT != null) ? OUT : string.Empty;
}
public static string GetProperty(SearchResult searchResult, string PropertyName)
{
if (searchResult.Properties.Contains(PropertyName))
{
return searchResult.Properties[PropertyName][0].ToString();
}
else
{
return string.Empty;
}
}
興味があれば、Linq to AD用の CodePlex プロジェクトがあります。
また、Paul Kimmel によるLINQ Unleashed for C#という本でも取り上げられています。彼は上記のプロジェクトを出発点として使用しています。
どちらのソースとも提携していません - 最近本を読んだばかりです