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

C# C在单独的DNS服务器上获取远程计算机的IP,c#,dns,remote-access,C#,Dns,Remote Access,我正在使用一个实用程序来管理指定域中的多台计算机,但不一定运行应用程序的计算机所在的域是指定根目录中的成员。我遇到的问题是,一旦我从外部AD OU收集了计算机名,由于DNS,我无法基于计算机名进行管理。如果提供DNS服务器的IP和该域的凭据,是否可以在外部DNS服务器上执行DNS查找 下面是我为在同一域中工作的初始化过程编写的代码。非常感谢您的任何意见 private Task InitializeComputers() { try { Computers.Cle

我正在使用一个实用程序来管理指定域中的多台计算机,但不一定运行应用程序的计算机所在的域是指定根目录中的成员。我遇到的问题是,一旦我从外部AD OU收集了计算机名,由于DNS,我无法基于计算机名进行管理。如果提供DNS服务器的IP和该域的凭据,是否可以在外部DNS服务器上执行DNS查找

下面是我为在同一域中工作的初始化过程编写的代码。非常感谢您的任何意见

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<Principal> 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 ...
    });
}

一旦您计划查询专用服务器作为DNS源,您就必须避开默认的LIB。在调查专用DNS请求时,如果没有记错的话,我尝试了以下方法:

一旦您计划将专用服务器查询为DNS源,您就必须退出默认LIB。在调查专用DNS请求时,如果没有记错的话,我尝试了以下方法:

接下来,我找到的解决方案就是从中衍生出来的。我编写了一个简单的DnsManager类,其中包含一个静态GetIPAddress方法,用于从记录中提取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...
    });
}

接下来,我找到的解决方案就是从中派生出来的。我编写了一个简单的DnsManager类,其中包含一个静态GetIPAddress方法,用于从记录中提取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...
    });
}

只需为这些远程计算机附加完整的域,例如machine.domain.tld,dns将自动查询domain.tld dns服务器。若你们只是做机器,那个么它将是查询机器。jamie_仍然_domain.tldI已经尝试过了。当我尝试执行Dns.GetHostEntryName+时,它仍然返回Host Not Found SocketExcpetionsping之前的CurrentConfig.DomainName。问题的另一部分是,它位于一个封闭的企业网络上,无法为托管我的计算机的DNS区域提出查找区域。应用程序正在尝试在一个单独的托管域上使用实验室虚拟机进行测试,该域可以通过IP访问,但不能通过DNS名称访问。Try:我查看了该线程,但希望确保没有一个.NET内置的方式来完成这项工作,而不必为外部DNS请求构建新的命名空间或导入另一个库。感谢您的响应!只需为这些远程计算机附加完整的域,例如machine.domain.tld,dns将自动查询domain.tld dns服务器。若你们只是做机器,那个么它将是查询机器。jamie_仍然_domain.tldI已经尝试过了。当我尝试执行Dns.GetHostEntryName+时,它仍然返回Host Not Found SocketExcpetionsping之前的CurrentConfig.DomainName。问题的另一部分是,它位于一个封闭的企业网络上,无法为托管我的计算机的DNS区域提出查找区域。应用程序正在尝试在一个单独的托管域上使用实验室虚拟机进行测试,该域可以通过IP访问,但不能通过DNS名称访问。Try:我查看了该线程,但希望确保没有一个.NET内置的方式来完成这项工作,而不必为外部DNS请求构建新的命名空间或导入另一个库。感谢您的响应!现在回顾这篇文章。谢谢你的回复!这篇文章似乎有点过时了。然而,@MarcB引用的线程中的文章有一个完整而现代的解决方案。当我将解决方案集成到我的项目中时,我将更新我的帖子。谢谢大家!现在回顾这篇文章。谢谢你的回复!这篇文章似乎有点过时了。然而,@MarcB引用的线程中的文章有一个完整而现代的解决方案。当我将解决方案集成到我的项目中时,我将更新我的帖子。谢谢大家!