4

我想监控dns地址的变化。所以我需要跟踪 dns 的变化。我现在正在用线程做。我得到 dns 并将其保存文件,然后我每 10 秒比较一次,但我需要更具体的解决方案。例如,有什么活动吗?这是代码:

获取域名:

public List<string> GetDns()
    {
        List<string> dns = new List<string>();
        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface networkInterface in networkInterfaces)
        {
            if (networkInterface.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();
                IPAddressCollection dnsAddresses = ipProperties.DnsAddresses;
                foreach (IPAddress dnsAdress in dnsAddresses)
                {
                        dns.Add(dnsAdress.ToString());
                }
            }
        }
        return dns;
    }

这是比较:

string[] xmlDns = xmlData.GetDatas("DNSs", "Dns");
        List<string> dns = getData.GetDns();
        for (int i = 0; i < xmlDns.Length; i++)
        {
                if ( xmlDns[i].Equals( dns[i]))
                {
                    this.Invoke(new MethodInvoker(delegate()
                    {
                        listBoxCheck.Items.Add(xmlDns[i] + " DNS was not changed.");
                    }));
                }
                else
                {
                    this.Invoke(new MethodInvoker(delegate()
                    {
                        listBoxCheck.Items.Add(xmlDns[i] + " DNS adress was changed as " + dns[i] );
                    }));
                }
        }
4

3 回答 3

1

DNS 是基于请求的。没有从 DNS 服务器到客户端的事件。您可能会使用 TTL(生存时间)元数据,它会告诉您 DNS 记录何时到期。

这是一个库,它公开 API 以查询给定的 dns 服务器SimpleDNS和获取TTL 值的文档。

于 2012-10-31T14:35:03.450 回答
0

您可以使用 WMI 查询来查询您的 DNS。循环查询并将返回的结果与之前的结果进行比较。当值发生变化时弹出一个消息框(或触发你的事件或其他东西)。

您必须使用 System.Management 命名空间才能完成此操作,或者管理命名空间可能包含用于查看 dns 的功能。但是这个我不确定。

于 2012-10-31T14:27:09.517 回答
0

@Candide 写道,DNS 中没有事件,这并不完全正确。特别是对于更改通知。

如果您控制 DNS 服务器,则可以将其设置为作为客户端向您发送 NOTIFY 消息。每当权威 DNS 服务器希望从属服务器更新区域内容时,就会(不保证,但最常见)发送此类消息。然后,您可以以您喜欢的任何方式对这些做出反应。大多数 DNS 服务器实现可能仅默认将 NOTIFY 消息发送到列出的名称服务器,但也可以配置为将它们发送到其他主机(例如,在 BIND 9 中,这是使用also-notify {}区域配置中的指令完成的)。

我不确定您将如何实施它;NOTIFY 是 DNS 协议的一部分,因此您实际上是在编写一个用途有限的 DNS 服务器实现来侦听这些消息并对其采取行动。您至少需要监视 UDP 和 TCP 上的端口 53(我相信实际上通知几乎总是在 UDP 上发送,但该标准还允许 TCP 传输),整理收到的任何 NOTIFY 消息,然后采取行动他们。

此外,由于不能保证交付它们,因此您还需要一个后备机制。

这是否是一个可行的选择完全取决于情况。

于 2012-11-01T13:30:18.300 回答