Найти DNS HostName с IP-адреса в локальной сети - PullRequest
1 голос
/ 05 января 2010

Привет всем. Я написал программу, которая последовательно сканирует определенные части локальной сети на наличие компьютеров (будет предоставлен код). Однако, когда я запускаю этот код, он возвращает только DNS-имя хоста компьютера, на котором он работает. Я изучал использование WMI, но не могу, поскольку у меня не всегда будут привилегии к обнаруженным компьютерам. Есть ли другой способ найти локальные компьютеры HostName?

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;

namespace CheckLocalNetwork
{
    class PingCheck
    {
        public static string fullip;

        public void CheckSequentialIP()
        {
            IPHostEntry IpEntry = Dns.GetHostEntry(fullip);

            Ping pingSender = new Ping();

            PingOptions options = new PingOptions();
            options.DontFragment = true;

            string data = "a";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 120;
            PingReply reply = pingSender.Send(fullip, timeout, buffer, options);

            if (reply.Status == IPStatus.Success)
            {
                Console.WriteLine("Address: {0}", reply.Address.ToString());
                Console.WriteLine("Host Name: {0}", IpEntry.HostName);
                Console.WriteLine("RoundTrip time: {0}", reply.RoundtripTime);
                Console.WriteLine("Time to live: {0}", reply.Options.Ttl);
                Console.WriteLine("Don't fragment: {0}", reply.Options.DontFragment);
                Console.WriteLine("Buffer size: {0}", reply.Buffer.Length);
                Console.WriteLine("");
            }
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Press enter to search for ip adresses that begin with 192.168.1");
            Console.ReadLine();

            for (int endofip = 1; endofip < 101; endofip++)
            {
                fullip = "192.168.1." + Convert.ToString(endofip);
                PingCheck checkfullip = new PingCheck();
                checkfullip.CheckSequentialIP();

            }
            Console.ReadLine();
    }

Вся помощь очень ценится.

1 Ответ

2 голосов
/ 05 января 2010

Хм - ваш пример кода работает на моем компьютере так, как ожидалось, то есть он возвращает имя хоста сканируемой машины.

Чтобы глубже изучить вашу проблему, вы пытались использовать nslookup для проверки разрешения IP-адресов?

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Rob>nslookup                  <-- type this at a command prompt
Default Server:  mydns.mydomain.co.uk  <--- these two lines indicate the dns server being used to resolve your queries
Address:  192.168.0.1                  <----|

> 192.168.0.5                          <---- type in the ip address of one of the machines in question
Server:  mydns.mydomain.co.uk
Address:  192.168.0.1

Name:    myworkstation.mydomain.co.uk  <---- this is the hostname, as reported by the DNS using a reverse lookup
Address:  192.168.0.5

Если это не возвращает имя машины, то у вас может быть проблема с разрешением имени, которая не связана с вашим кодом.

Если все выглядит хорошо, то, возможно, стоит перечислить коллекцию IpEntry.Aliases. Здесь есть какие-нибудь записи, и имеют ли они смысл?

Наконец, у вас есть именно тот код, который вам не подходит, или это "перегнанный" пример? Причина, по которой я спрашиваю, состоит в том, что документация для Dns.GetHostEntry гласит

"Когда пустая строка передается как имя хоста, этот метод возвращает IPv4-адреса локального хоста. "

Я также заметил, что вы держите "fullip" в статике. Если это не тот код, который вызывает проблему, , особенно если он работает многопоточно , есть ли вероятность, что вы не инициализируете "fullip" до вызова Dns.GetHostEntry?

Может быть, я далеко, но я подумал, что стоит дать мозговую оценку тому, что произошло со мной, когда я посмотрел на вашу проблему:)

[ EDIT: ] - ваш комментарий к kdt прояснил кое-что, что я неправильно понял. Я подумал вы говорили, что всегда возвращали имя хоста для своего локального компьютера, независимо от того, какой компьютер вы "сканировали" - это очень странное поведение. На самом деле, я думаю, что вы говорите, что вы просто возвращаете IP-адреса для других машин (их IP-адреса) и получаете только имя хоста для своего локального компьютера. Не обращайте внимания на мой последний бит о потоке и пустом аргументе.

Это гораздо проще объяснить - ваша машина почти наверняка просто не в состоянии разрешить имена компьютеров - я предполагаю, что мой тест nslookup, который я предложил, также не вернет имена компьютеров.

Чтобы разрешить эти IP-адреса для имен хостов, вашему компьютеру необходим DNS, в котором есть записи для этих компьютеров или чтобы они были в локальном файле хостов; ваша машина на самом деле не запрашивает у имя удаленной машины, когда вы делаете этот вызов, поэтому он не сможет найти ее без помощи одного из обычных путей разрешения имен.

Это работает для меня, потому что мой локальный DNS действительно имеет записи для всех машин в моей сети, преобразовывая их имена хостов в IP-адреса и наоборот.

...