在使用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;
}
...
...
}发布于 2011-01-12 16:07:31
不幸的是,我认为没有其他真正的方法。只需考虑如何验证ip地址是否可达。您所能做的就是尝试连接或发送ping请求。在此之后,您只需等待是否有人应答,并且由于连接可能很慢的事实,超时很高,您必须一直等待。
为了获得更好的用户体验,您所能做的就是将此作业放到另一个踏板(或后台工作线程)中,这样您的GUI仍然可以响应,并向用户显示一些进度或字幕栏。然后,您还可以通过简单地中止此线程来为用户添加取消连接尝试的可能性。
因此,这不会使它更快,但会给用户更好的响应,所以它最终感觉更快。
发布于 2011-01-12 17:24:34
我能想到的唯一其他选择是使用森林来枚举域。即
var myDomain = Domain.GetCurrentDomain(); //or .GetComputerDomain();
var forestDomains = myDomain.Forest.Domains;这假设您想要的所有域都在同一林中。然后,您需要针对此集合测试用户输入的domainId,可能还需要针对每个域的.Name属性进行测试。
发布于 2016-10-07 01:20:19
这是我不使用Forest的方法。一些只读服务器在使用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;
}
}这比你发布的方式快得多。这段代码不会尝试解析域,但是您需要知道您正在使用的目录服务器。
我也有一些检查null参数的代码,但是我在这个回复中去掉了它。
查尔斯。
https://stackoverflow.com/questions/4666334
复制相似问题