我想为人们创建一个快速应用程序,以便从一组凭据中解析存储在Active Directory中的用户的名称。某些应用程序仅提供用户ID,并且期望最终用户启动Active Directory用户和组MMC管理单元太多。
输入将类似于“MYCORP \ a_user”,输出将是“Dave Smith”,如果这是存储在AD中的内容。
我希望这能够在我的测试域和多林环境中运行。
有人可以提供这样做的样本吗?从AD中检索其他属性(如电话号码)是否遵循相同的模式?
目标平台:.NET 2.0及更高版本。
答案 0 :(得分:3)
以下是我使用的代码,取自我的身份验证类:
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很糟糕。正如您所看到的,即使是最基本的东西也需要大量的代码才能完成。我想看到一个不需要使用流控制异常的用户身份验证方法。
答案 1 :(得分:2)
使用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 \ Reference Assemblies \ Microsoft \ WindowsPowerShell \ v1.0 \ System.Management.Automation.dll
添加一个引用答案 2 :(得分:0)
请参阅DirectorySearcher,加载属性“DisplayName”。