Active Directory:如何查找域是否可用?

时间:2011-01-12 07:37:52

标签: c# active-directory

在使用GetDomain之前,有没有办法找出ActiveDirectory中是否有域可用?我有一个应用程序,用户应该能够自己添加域名,如果他们输入无效的域名,应该有一个错误。现在它通过捕获下面的例外来处理,但是输入无效域的用户几乎不是特殊情况,并且异常也可能需要很长时间才能被抛出,特别是如果输入了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 个答案:

答案 0 :(得分:5)

我能想到的唯一其他选择是使用林来枚举域。即。

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

这假设您想要的所有域都在同一个林中。然后,您需要针对此集合测试用户输入domainId,可能针对每个域.Name属性进行测试。

答案 1 :(得分:3)

不幸的是,我认为没有其他方法。试想一下如何验证IP地址是否可达。您所能做的就是尝试连接或发送ping请求。在此之后你只需等待有人会回答,并且由于连接速度很慢,超时很长,你必须一直等待。

为了获得更好的用户体验,您可以做的就是将此作业放到另一个步骤(或后台工作者)中,以便您的GUI仍然响应并向用户显示一些进度或选框栏。然后,您还可以通过简单地中止此线程来添加用户取消连接试用的可能性。

所以这不会让它变得更快,但会更好地响应用户,所以最后感觉更快。

答案 2 :(得分:3)

这就是我这样做的方式,不使用森林。一些只读服务器在使用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;
  }
}

这远比你发布的方式快得多。此代码不会尝试解析域,但您需要知道您正在使用的目录服务器。

我还有一些代码可以检查空参数,但是我已将其修改为此回复。

查尔斯。

答案 3 :(得分:1)

我们需要更多信息才能给您一个好的答案。 Active Directory确实存储有关所有受信任域的信息。因此,只需查看全局编录并且不真正绑定到域控制器,就可以找到所有可信域信息。

但是,您需要注意,即使Active Directory上存在域信息,也不意味着您可以绑定它。您可能没有绑定权限,或者您环境中的防火墙设置可能阻止您访问某些域。

我在这里假设以下事项。

  1. 运行软件的计算机已加入域。
  2. 您在运行软件时以域用户身份登录
  3. 您只有一个森林,但森林包含很多域
  4. 您的林中有一个全局目录(通常,您有)
  5. 您正在输入DNS域名但不输入NETBIOS域名
  6. 您可以使用以下代码检查当前林中是否存在该域。如果是,则继续调用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());
    }
    

答案 4 :(得分:0)

我已尽力检查域路径。这对我有用。

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; }
            }