【问题标题】:Hostname scanning in C#C#中的主机名扫描
【发布时间】:2010-06-28 21:34:55
【问题描述】:

我最近开始了 ICT 技术员的新工作,我正在创建一个控制台应用程序,其中包含有助于我们日常工具的东西!

我的第一个工具是网络扫描仪,我们的系统目前在 Vanilla 和 Asset 标签上运行,但我们可以找到主机名/IP 地址的唯一方法是进入 Windows 控制台工具和 nslookup,这对我来说可以改进

我想创建一个应用程序,在其中输入一个 6 位数字,该应用程序将搜索整个 DNS 以寻找可能的匹配项!

我们的主机名是这样的

ICTLN-D006609-edw.srv.internal d 006609 将是该计算机的资产标签。

我希望将它输入到控制台应用程序中,它会搜索每个主机名,字符串中包含输入的资产标签的主机名将与 IP 和完整的计算机名称一起返回,以供 VNC/远程桌面使用。

首先,我将如何构建它,我应该将项目作为控制台应用程序还是 WPF 启动。您能否提供一个示例,说明我如何通过 C# 扫描主机名,或者如果有 opensource C# 版本,您能否提供链接。

任何信息都会有很大帮助,因为它会解决工作区中的很多问题,因为我们必须要求客户进入我的电脑和属性等,然后将计算机名称读回以使用,我认为这毫无意义.

问候。

更新: *1 我制作的 C# 版本:http://pastebin.com/wBWxyyuh

【问题讨论】:

    标签: c# dns hostname asset-management


    【解决方案1】:

    我实际上会使用 PowerShell 来解决这个问题,因为自动化任务有点像它的东西。事实上,这是一个 PowerShell 脚本,用于列出网络上可见的所有计算机。如果你真的想要它,这很容易翻译成 C#。

    function Find-Computer( [string]$assetTag ) {
    
        $searcher = New-Object System.DirectoryServices.DirectorySearcher;
        $searcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry;
        $searcher.SearchScope = 'Subtree';
        $searcher.PageSize = 1000;
        $searcher.Filter = '(objectCategory=computer)';
    
        $results = $searcher.FindAll();
        $computers = @();
        foreach($result in $results) {
            $computers += $result.GetDirectoryEntry();
        }
        $results.Dispose(); #Explicitly needed to free resources.
    
        $computers |? { $_.Name -match $assetTag }
    }
    

    【讨论】:

    • 我确实希望保留它 C#,因为我首先开始研究它是一个很棒的小项目,让我了解 System.net 命名空间。我不认为我会使用 PowerShell,因为我不想在所有管理员控制台上安装它们,但在共享服务器中可能有一个 exe。
    • 就像我说的,这很容易翻译。它使用 .NET 类(特别是 System.DirectoryServices 命名空间)进行实际搜索。这些可以在 .NET 中以完全相同的方式使用,像这样的简单翻译将是向自己介绍 C# 的好方法。
    • 是的,谢谢我刚刚构建了一些似乎可以工作的东西,但我必须等到开始工作才能真正测试它。但是您能否发表评论并告诉我这是否是实现它的最佳方法?更新了我的帖子。
    • 您在更新 1 中发布的代码对我来说根本不起作用。它只检测到我自己的机器(当我输入 * 时),它列出了 4 次。此外,似乎 DNS 查找的效率通常低于 Active Directory 搜索。
    【解决方案2】:

    您可以通过以下方式完成此操作,尽管它不是最好的。您可能会考虑使用 Active Directory 来查找网络上的合法机器。下面的代码展示了如何解析机器名称,并展示了如何 ping 它:

    static void Main()
    {
    
        for (int index = 0; index < 999999; index++)
        {
            string computerName = string.Format("ICTLN-D{0:000000}-edw.srv.internal", index);
            string fqdn = computerName;
    
            try
            {
                fqdn = Dns.GetHostEntry(computerName).HostName;
            }
            catch (SocketException exception)
            {
                Console.WriteLine(">>Computer not found: " + computerName + " - " + exception.Message);
            }
    
            using (Ping ping = new Ping())
            {
                PingReply reply = ping.Send(fqdn);
                if (reply.Status == IPStatus.Success)
                {
                    Console.WriteLine(">>Computer is alive: " + computerName);
                }
                else
                {
                    Console.WriteLine(">>Computer did not respond to ping: " + computerName);
                }
            }
        }
    }
    

    希望对您有所帮助...

    【讨论】:

    • 这里的问题是主机名各不相同,例如 Section-D(id)-Server-ProtectionLevel 等,有时它们确实会发生很大变化,因此我们需要使其更广泛。
    • 您可以使用类似的技术来查找一个子网中的所有活动机器,例如从 192.168.1.1 搜索到 192.168.1.254。那将与上述相同。 For/Next 通过范围,查看是否可以解析名称,并尝试 ping 它。这不是万无一失的,但应该会给你一些不错的结果。
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2012-06-03
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多