如何从使用C#的用户名获取存储在Active Directory中的真实姓名?

时间:2009-01-02 16:23:36

标签: c# active-directory ldap

我想为人们创建一个快速应用程序,以便从一组凭据中解析存储在Active Directory中的用户的名称。某些应用程序仅提供用户ID,并且期望最终用户启动Active Directory用户和组MMC管理单元太多。

输入将类似于“MYCORP \ a_user”,输出将是“Dave Smith”,如果这是存储在AD中的内容。

我希望这能够在我的测试域和多林环境中运行。

有人可以提供这样做的样本吗?从AD中检索其他属性(如电话号码)是否遵循相同的模式?

目标平台:.NET 2.0及更高版本。

3 个答案:

答案 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”。