ActiveDirectory: как узнать, доступен ли домен? - PullRequest
4 голосов
/ 12 января 2011

Есть ли способ узнать, доступен ли домен в ActiveDirectory перед использованием GetDomain?У меня есть приложение, в котором пользователи должны иметь возможность самостоятельно добавлять домены, и если они вводят неверный домен, должна быть ошибка.Прямо сейчас это обрабатывается путем перехвата исключения ниже, но пользователь, входящий в неверный домен, вряд ли является исключением, и исключение также может занять очень много времени, особенно если вводится IP-адрес (кажется, что),Есть ли лучшее решение для этого?

public Domain RegisterUserDirectory(string domainId) {
  DirectoryContext context = new DirectoryContext(DirectoryContextType.Domain, domainId);

  System.DirectoryServices.ActiveDirectory.Domain domain;
  try {
    domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(context);
  }
  catch (ActiveDirectoryNotFoundException adne) {
    // handle
  }
  catch (Exception e) {
    Log.Warning("Failed to contact domain {0}: {1}", domainId, e.Message);
    throw;
  }

  ...
  ...
}

Ответы [ 5 ]

5 голосов
/ 12 января 2011

Единственный другой вариант, который я могу придумать, - это использовать лес для перечисления доменов.т.е.

 var myDomain = Domain.GetCurrentDomain();  //or .GetComputerDomain();
 var forestDomains = myDomain.Forest.Domains;

Предполагается, что все домены, которые вы хотите, находятся в одном лесу.Затем вам нужно протестировать пользователя, введенного domainId для этой коллекции, возможно, для каждого свойства .Name каждого домена.

3 голосов
/ 06 октября 2016

Вот как я это делаю, не используя Лес.Некоторые серверы только для чтения имеют проблемы с использованием класса Forest, поэтому, если я получаю исключение с помощью моего обычного метода DomainExists, я вместо этого попробую этот.

public static bool DomainExistsNoForests(string domain, string server)
{
  try {
    DirectoryContext directoryContext = new DirectoryContext(DirectoryContextType.DirectoryServer, server);
    Domain d = Domain.GetDomain(directoryContext);
    if (d.Name.Trim().Equals(domain.Trim(), StringComparison.CurrentCultureIgnoreCase)) return true;
    return false;
  }
  catch (Exception e) {
    return false;
  }
}

Это намного, намного быстрее, чем вы отправили,Этот код не пытается разрешить домен, но вам нужно знать сервер каталогов, который вы используете.

У меня также есть некоторый код для проверки на нулевые аргументы, но я обрезал его для этого ответа.

Charles.

3 голосов
/ 12 января 2011

К сожалению, я думаю, что нет другого реального пути. Подумайте, как вы проверяете, что IP-адрес доступен. Все, что вы можете сделать, это попробовать подключиться или отправить запрос ping. После этого вам просто нужно подождать, если кто-то ответит, и из-за того, что соединение может быть медленным, время ожидания велико, и вам приходится все время ждать.

Все, что вы можете сделать для лучшего пользовательского опыта, это поместить это задание в другой шаг (или в фоновый режим), чтобы ваш графический интерфейс по-прежнему реагировал и показывал пользователю некоторый прогресс или полосу выделения. Затем вы также можете добавить возможность отмены попытки подключения, просто прервав эту тему.

Так что это не сделает его быстрее, но даст лучший отклик пользователю и, наконец, будет быстрее.

1 голос
/ 13 января 2011

Нам нужна дополнительная информация, чтобы дать вам хороший ответ.Active Directory хранит информацию обо всех доверенных доменах.Таким образом, можно узнать всю информацию о доверенном домене, просто взглянув на Глобальный каталог и не привязываясь к контроллеру домена.

Однако вы должны знать, что даже если информация о домене существует наActive Directory, это не значит, что вы можете связываться с ним.Возможно, у вас нет прав на привязку к нему, или настройки брандмауэра в вашей среде могут заблокировать ваш доступ к некоторым доменам.

Я предполагаю следующее:

  1. Компьютер, на котором запущено ваше программное обеспечение, уже присоединен к домену.
  2. Вы входите в систему как пользователь домена при запуске программного обеспечения
  3. У вас есть только один лес, но в лесу много доменов
  4. У вас есть глобальный каталог вВаш лес (очень часто у вас есть)
  5. Вы вводите имя домена DNS, но не имя домена NETBIOS

Вы можете использовать следующий код, чтобы проверить, существует ли домен в вашемтекущий лес.Если да, то продолжайте вызывать Domain.GetDomain (context) для получения вашего объекта Domain.Если по каким-либо причинам вы не можете связать его, вам все еще нужно дождаться истечения времени ожидания.

private bool DomainExist(string domain)
{
    HashSet<string> domains = new HashSet<string>();
    foreach (Domain d in Forest.GetCurrentForest().Domains)
    {
        domains.Add(d.Name.ToLower());
    }

    return domains.Contains(domain.ToLower());
}
0 голосов
/ 06 апреля 2018

Я старался изо всех сил, чтобы проверить путь к домену. Это сработало для меня.

try
            {
                FileAttributes attr = File.GetAttributes(textBox1.Text);
                if ((attr & FileAttributes.Directory) == FileAttributes.Directory) { }
            }
            catch (ArgumentException e1)
            {
                result = false;
            }
            catch (IOException e2)
            {
                if (e2.Message.Contains("The network path was not found."))
                {
                    result = false;
                }
                else { result = true; }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...