如何从使用C#的用户名中获取存储在Active Directory中的真实姓名?
我想为人们创建一个快速应用程序,以便从一组凭据中解析存储在Active Directory中的用户的名称。某些应用程序仅提供用户标识,并且期望最终用户启动Active Directory用户和组MMC管理单元太多。如何从使用C#的用户名中获取存储在Active Directory中的真实姓名?
输入将类似于“MYCORP \ a_user”,输出将是“Dave Smith”,如果这是AD中存储的内容。
我希望这能够在我的测试域以及多森林环境中运行。
有人可以提供一个这样做的样本吗?从AD等其他属性中检索如电话号码是否遵循相同的模式?
目标平台:.NET 2.0及以上版本。
这是我使用的代码,从我的验证类采取:
string[] strUserName = username.Split("\\".ToCharArray());
using (var entry = new DirectoryEntry("LDAP://" + ADServer, ADServiceDomain + "\\" + ADServiceAccount, ADServicePassword))
using (var ds = new DirectorySearcher(entry, "sAMAccountName=" + strUserName[1])) {
ds.SearchScope = SearchScope.Subtree;
SearchResult result = ds.FindOne();
string fullname = result.Properties["displayName"][0].ToString();
}
的System.DirectoryServices很烂。正如你所看到的,即使是最基本的事情也需要大量的代码。我希望看到一个用户认证方法,不需要使用流量控制的异常。
请小心,因为如果不存在与ActiveDirectory对象相关的一些已知内存泄漏使用正确。 http://englestone.blogspot.com/2008/06/active-directory-memory-leaks-c.html - Lee – 2009-09-10 15:06:36
使用Active Directory是在C#有点不好受,确保3.5增加了一些新的课程,以帮助,但对于纯粹的生产力,我喜欢使用PowerShell和Quest的免费PowerShell Commands for Active Directory 在这种情况下,代码看起来像
get-qaduser userid | select PhoneNumber,DisplayName
,如果你需要这个作为你的C#程序的一部分运行,你可以做到这一点
public static IEnumerable<PSObject> Invoke(string script, params object[] input)
{
IList errors = null;
using (var run = new RunspaceInvoke())
{
var psResults = run.Invoke(script, input, out errors);
if (errors != null && errors.Count > 0)
Debug.WriteLine(errors.Count);
foreach (PSObject res in psResults)
yield return res;
}
}
PSObject psUser = POSHelp.Invoke(
@"add-pssnapin Quest.ActiveRoles.ADManagement
($userid) = $input | % { $_ }
get-qaduser $userid", "auserid").Single();
Debug.WriteLine(psUser.Properties["DisplayName"].Value);
添加裁判Program Files文件\参考大会\微软\ WindowsPowerShell \ V1.0 \ System.Management。 Automatio n.dll
...并在SamAccountName上进行筛选(但只通过使用用户名,在“domain \”部分之后)... – 2009-02-05 21:31:33