繁体   English   中英

如何在 C# 中从 Active Directory 获取用户并将其显示在 ComboBox 中

[英]How to get users from Active Directory in C# and display them in a ComboBox

我试图在ComboBox控件中显示来自网络上 Active Directory 的用户。 为此,我有下一个功能:

public static List<Usuario> MostrarUsuariosDominio()
    {
        List<Usuario> rst = new List<Usuario>();

        try
        {

            DirectoryContext dc = new DirectoryContext(DirectoryContextType.Domain, Environment.UserDomainName);
            Domain domain = Domain.GetDomain(dc);
            DirectoryEntry de = domain.GetDirectoryEntry();

            DirectorySearcher adSearcher = new DirectorySearcher(de); 

            adSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
            adSearcher.PropertiesToLoad.Add("samaccountname");

            SearchResult result;
            SearchResultCollection iResult = adSearcher.FindAll();

            Usuario item;
            if (iResult != null)
            {
                for (int counter = 0; counter < iResult.Count; counter++)
                {
                    result = iResult[counter];
                    if (result.Properties.Contains("samaccountname"))
                    {
                        item = new Usuario();

                        item.Nombre = (String)result.Properties["samaccountname"][0];

                        rst.Add(item);
                    }
                }
            }

            adSearcher.Dispose();
        }

        catch (Exception ex)
        {
            Usuario item = new Usuario();
            item.Nombre = "No se pudo recuperar la lista de usuarios";
            rst.Add(item);
        }

        return rst;
    }

如果我在域控制器的 PC 上运行应用程序,它工作正常:该函数将所有用户返回给我。 但如果我在另一台 PC 上运行它,我会遇到异常:

指定的域不存在或无法与其联系

有什么方法可以从另一台 PC 恢复用户列表?

这一行:

DirectoryContext dc = new DirectoryContext(DirectoryContextType.Domain, Environment.UserDomainName);

告诉它连接到当前用户登录的域。 您是否以域用户身份登录?

也许检查Environment.UserDomainName等于什么,看看它是否正确。

如果它是正确的,那么它可能是一个网络问题 - 它无法与域对话。 你需要连接到VPN吗?

要获取 Active Directory 域中的所有用户,您可以使用DirectorySearcher类对象向域查询有关该域中所有可用用户的信息。

DirectorySearcher类包含在System.DirectoryServices命名空间中,是用于对 Active Directory 域服务执行查询的类。

在此页面中是有关如何执行此操作的示例:

 ... string DomainPath = "LDAP://DC=xxxx,DC=com" DirectoryEntry searchRoot = new DirectoryEntry(DomainPath); DirectorySearcher search = new DirectorySearcher(searchRoot); search.Filter = "(&(objectClass=user)(objectCategory=person))"; search.PropertiesToLoad.Add("samaccountname"); search.PropertiesToLoad.Add("mail"); search.PropertiesToLoad.Add("usergroup"); search.PropertiesToLoad.Add("displayname");//first name SearchResultCollection resultCol = search.FindAll(); ...

在 DirectorySearcher 中,创建一个 DirectorySearcher 对象,用于搜索域中的所有用户。 search.Filter = "(&(objectClass=user)(objectCategory=person))"过滤搜索。

搜索过滤器语法看起来有点复杂,但基本上它将搜索结果过滤为仅包含用户 -> "objectCategory=person""objectClass=user" - 并通过对 userAccountControl 标志和“帐户禁用”标志。

要指向本地 Active Directory 域,您可以使用以下命令:

DirectoryEntry searchRoot = new DirectoryEntry("WinNT://" + Environment.MachineName);

您可以将该示例与使用foreach的代码结合起来,而不是在页面示例中使用for循环:

foreach (SearchResult result in resultCol)
{
    yourComboBox.Items.Add(result.Properties["displayname"]);
}

我在这里留下了一些来自 Microsoft MSDN 和 codeproject.com 站点的页面:

DirectorySearcher 类

在 C# 中获取 Active Directory 用户列表

SearchResultCollection 类

搜索结果类

SearchResult.Properties 属性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM