通过C#

时间:2018-05-07 13:53:38

标签: c# active-directory visual-studio-2017

我试图在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恢复用户列表?

2 个答案:

答案 0 :(得分:3)

这一行:

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

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

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

如果它是对的,则可能是网络问题 - 它无法与域通信。你需要连接到VPN吗?

答案 1 :(得分:0)

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

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

  

在此page中有一个关于如何操作的示例:

...
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))"过滤搜索。

     

搜索过滤器语法看起来有点复杂,但基本上就是这样   将搜索结果过滤为仅包含用户 - &gt; "objectCategory=person""objectClass=user" - 并且不包括在内   用户帐户通过执行userAccountControl的按位AND   标志和“帐户禁用”标志。

要指向本地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 Class

Get List of Active Directory Users in C#

SearchResultCollection Class

SearchResult Class

SearchResult.Properties Property

相关问题