Получить пользователей из Active Directory в C # - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь показать в элементе управления 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;
    }

Если я запускаю приложение на ПК, на котором установлен контроллер домена, оно работает нормально: функция возвращает мне всех пользователей. Но если я запускаю его на другом ПК, я получаю исключение:

Указанный домен не существует или не может связаться с ним

Есть ли способ восстановить список пользователей с другого ПК?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Чтобы получить всех пользователей в домене 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 Class

Получить список пользователей Active Directory в C #

SearchResultCollection Class

Класс SearchResult

SearchResult.Properties Property

0 голосов
/ 07 мая 2018

Эта строка:

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

Сообщает ему подключиться к домену, в который вошел текущий пользователь. Вы вошли как пользователь домена?

Может быть, проверить, чему равен Environment.UserDomainName и посмотреть, правильно ли это.

Если это правильно, то это может быть проблема сети - он не может общаться с доменом. Вам нужно подключиться к VPN?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...