C#在单独的DNS服务器上获取远程计算机的IP

我正在开发一个实用程序,用于管理指定目录根目录下的指定域中的多台计算机(不一定是运行该应用程序的计算机所属的域)。 我遇到的问题是,一旦我从外部AD OU收集了计算机名称,由于DNS,我无法根据计算机名称进行管理。 是否可以在外部DNS服务器上执行DNS查找,前提是DNS服务器的IP和该域的凭据?

这是我用于初始化过程的代码(在同一个域中工作)。 真的很感激任何输入!

private Task InitializeComputers() { try { Computers.Clear(); object cLock = new object(); PrincipalContext context = new PrincipalContext(ContextType.Domain, CurrentConfiguration.LDAPAddress, CurrentConfiguration.DirectoryRoot, ContextOptions.Negotiate, CurrentConfiguration.AdminUser, CurrentConfiguration.AdminPassword); ComputerPrincipal computer = new ComputerPrincipal(context); computer.Name = "*"; PrincipalSearcher searcher = new PrincipalSearcher(computer); PrincipalSearchResult result = searcher.FindAll(); Parallel.ForEach(result, (r) => { ComputerPrincipal principal = r as ComputerPrincipal; DirectoryObject cObject = new DirectoryObject(CurrentConfiguration) { Name = principal.Name }; lock (cLock) { Computers.Add(cObject); } }); } ... // Catch stuff here } private async Task InitializeConnections() { Task[] tasks = Computers.Select(x => x.CheckConnectionAsync()).ToArray(); await Task.WhenAll(tasks); } // This is where I need to be able to get the IP Address. Thoughts??? public Task CheckConnectionAsync() { return Task.Run(() => { try { Ping PingCheck = new Ping(); PingReply Reply = PingCheck.Send(Name); // <--- need IP Address instead if (Reply.Status == IPStatus.Success) { IsAvailable = true; IPHostEntry host = Dns.GetHostEntry(Name); // Does not work for machines on different domain. IPAddress = host.AddressList.FirstOrDefault().ToString(); } else { IsAvailable = false; IsWMIActive = false; } } ... // catch stuff here ... }); } 

为了跟进,我找到的解决方案来自Heijden的DNS Resolver 。 我用一个静态GetIPAddress方法编写了一个简单的DnsManager类,用于从A记录中提取IP。

 public static string GetIPAddress(string name) { Resolver resolver = new Resolver(); resolver.DnsServer = ((App)App.Current).CurrentConfiguration.DNSAddress; resolver.Recursion = true; resolver.Retries = 3; resolver.TimeOut = 1; resolver.TranportType = TransportType.Udp; Response response = resolver.Query(name, QType.A); if (response.header.ANCOUNT > 0) { return ((AnswerRR)response.Answer[0]).RECORD.ToString(); } return null; } 

然后,更新的CheckConnectionAsync方法现在编写如下:

 public Task CheckConnectionAsync() { return Task.Run(() => { try { IPAddress = DnsManager.GetIPAddress(Name + "." + CurrentConfig.DomainName); ... // check availability by IP rather than name... } // catch stuff here... }); } 

只要您计划将专用服务器作为DNS源进行查询,就必须从默认库中退出。 一旦调查专用DNS请求,我尝试了这个(如果没记错的话): http : //www.codeproject.com/Articles/12072/C-NET-DNS-query-component