C# Get IP of Remote Computer on Separate DNS Server

半世苍凉 提交于 2019-12-23 05:25:51

问题


I am working on a utility for managing multiple computers in a specified domain (not necessarily the domain the computer the application is running on is a member of) within a specified directory root. The problem I am running into is once I have the collection of computer names from the external AD OU, I am unable to manage based on computer name because of DNS. Is it possible to perform DNS lookup on an external DNS server provided the IP of DNS server and credentials for that domain?

Here is the code that I have for the initialization process (works within the same domain). Really appreciate any input!

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

回答1:


To follow up, the solution that I found is derived from Heijden's DNS Resolver. I wrote a simple DnsManager class with a single static GetIPAddress method for extracting the IP out of an A Record.

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

Then, the updated CheckConnectionAsync method is now written like so:

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



回答2:


As soon as you plan to query dedicated server as DNS source, you have to step aside from default libs. I tried this (if remember correctly) once investigating dedicated DNS requests: http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component



来源:https://stackoverflow.com/questions/25727997/c-sharp-get-ip-of-remote-computer-on-separate-dns-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!