在使用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;
}
...
...
}
答案 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上存在域信息,也不意味着您可以绑定它。您可能没有绑定权限,或者您环境中的防火墙设置可能阻止您访问某些域。
我在这里假设以下事项。
您可以使用以下代码检查当前林中是否存在该域。如果是,则继续调用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; }
}