3

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

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

我希望它能够在我的测试域以及多林环境中运行。

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

目标平台:.NET 2.0 及以上。

4

3 回答 3

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 很烂。如您所见,即使是最基本的事情也需要大量的代码。我希望看到一种不需要使用异常进行流控制的用户身份验证方法。

于 2009-01-02T16:55:14.607 回答
2

在 C# 中使用 Active Directory 有点痛苦,当然 3.5 添加了一些新的类来提供帮助,但是为了纯粹的生产力,我喜欢使用 Powershell 和 Quest 的免费PowerShell 命令用于 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

于 2009-01-02T18:24:04.147 回答
0

请参阅DirectorySearcher,加载属性“DisplayName”。

于 2009-01-02T16:42:45.677 回答