【问题标题】:NSLookup using third party library in c#NSLookup 在 c# 中使用第三方库
【发布时间】:2017-03-12 21:41:21
【问题描述】:

我正在使用这个 c# librabry 进行 nslookup 查找域的名称服务器。这是我的 c# 代码

public async System.Threading.Tasks.Task<List<NS>> RunCmd(params string[] domains)
    {


        List<NS> NSL = new List<NS>();
        var lookup = new LookupClient();
        lookup.EnableAuditTrail = true;
        foreach (var item in domains)
        {
            var result = await lookup.QueryAsync(item, QueryType.NS);
            // rootDomain = result.AllRecords.FirstOrDefault().DomainName.Value;
            var nameServer = result.AuditTrail;
            var record = Regex.Match(nameServer.ToString(), @"ns\d"+ "."+ item).Value;
            NSL.Add(new NS { domainName=item,nameServers= record});


        }

        var workbook = new XLWorkbook();
        workbook.AddWorksheet("sheetName");
        var ws = workbook.Worksheet("sheetName");

        int row = 1;
        foreach (var item in NSL)
        {
            ws.Cell("A" + row.ToString()).Value = item.domainName.ToString();
            ws.Cell("B" + row.ToString()).Value = item.nameServers.ToString();
            row++;
        }
        string folderPath = "D:\\";
        workbook.SaveAs(folderPath+"nameServer.xlsx");


        return NSL;

    }

所以我传递了一个域数组,我需要知道它们的名称服务器并将它们返回到一个列表中,还将它们写入我本地目录中的一个 excel 文件中。我无法从响应中获取名称服务器 (var nameServer)直接所以我使用正则表达式从字符串中拆分名称服务器。所以根据我当前的正则表达式,如果它们是 ns1 和 ns2,如果它们不是像 ns1262 或 ns2636 这样的任何东西,我就可以获得一个空字符串来自正则表达式。

这是我在变量 nameServer 中得到的两个不同的示例响应

; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 29412
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
mobilecellvideo.com.                IN  NS

;; ANSWER SECTION:
mobilecellvideo.com.            66306   IN  NS  ns2.mobilecellvideo.com.
mobilecellvideo.com.            66306   IN  NS  ns1.mobilecellvideo.com.

;; Query time: 132 msec
;; SERVER: 106.51.113.3#53
;; WHEN: Mon, 13 Mar 2017 02:55:38 GMT
;; MSG SIZE  rcvd: 73

对于下面的响应,当我尝试匹配上面的正则表达式时,我只得到一个空字符串

; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 29414
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
networkwonder.com.                  IN  NS

;; ANSWER SECTION:
networkwonder.com.              300     IN  NS  ns2626.ztomy.com.
networkwonder.com.              300     IN  NS  ns1626.ztomy.com.

;; Query time: 436 msec
;; SERVER: 106.51.113.3#53
;; WHEN: Mon, 13 Mar 2017 03:09:01 GMT
;; MSG SIZE  rcvd: 83

任何帮助将不胜感激

提前致谢!

【问题讨论】:

    标签: c# dns nameservers nslookup


    【解决方案1】:

    完全没有必要再次尝试通过正则表达式从result.AuditTrail 属性中提取信息。 AuditTrail 仅用于记录信息!您想要的所有数据都已经在结果中,并且 DnsClient.NET 库为您提供所有内容的强类型结果。

    This is 所有你得到的结果。答案、权威等的列表......

    DnsQueryResponse 是您应该使用的实际 DNS 结果。 根据您提出的问题,相关数据可能位于 Answers、Additions 或 Authorities 中。

    您的错误是(查看注释代码),您尝试检查所有记录上的 DomainName 字符串以查找您的 NS 名称,但这不是找到它们的地方;) DomainName 用于任何事情,主要用于查询。 每条记录都有自己的字段来存储记录特定的数据,NsRecord 也是如此。

    因此,下面的示例为您提供了 ns 记录和您想要的 ns 名称

    var lookup = new LookupClient();
    var result = await lookup.QueryAsync("google.com", QueryType.NS);
    
    foreach(var nsRecord in result.Answers.NsRecords())
    {
        Console.WriteLine(nsRecord.NSDName);
    }
    

    这将打印类似的东西

    ns4.google.com. ns1.google.com. ns3.google.com. ns2.google.com.

    希望有帮助

    【讨论】:

    • 谢谢哥们,希望你是我现在使用的图书馆的所有者,它只是完美的!
    • @Melvin 是的,我和 np ;) 玩得开心
    【解决方案2】:

    你需要改变你的正则表达式

    var record = Regex.Match(nameServer.ToString(), @"ns\d"+ "."+ item).Value;

    到:

    var record = Regex.Match(nameServer.ToString(), @"ns\d+"+ "."+ item).Value;

    当您向 \d 添加加号时,您正在寻找一位或无限位数字

    您可以使用Regex101 来检查您的正则表达式。

    更新

    我对这个解决方案没有帮助你感到有点惊讶,所以我尝试修复你的代码。

    在我的示例中,输入是 google.es,因此在以下代码中: foreach (var item in domains)item=="google.es",DNS 的答案是:

    ; (2 server found)
    ;; Got answer:
    ;; ->>HEADER<<- opcode: Query, status: No Error, id: 10049
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 512
    ;; QUESTION SECTION:
    google.es.                          IN  NS
    
    ;; ANSWER SECTION:
    google.es.                      86399   IN  NS  ns2.google.com.
    google.es.                      86399   IN  NS  ns3.google.com.
    google.es.                      86399   IN  NS  ns4.google.com.
    google.es.                      86399   IN  NS  ns1.google.com.
    
    ;; Query time: 74 msec
    ;; SERVER: 8.8.8.8#53
    ;; WHEN: Mon, 13 Mar 2017 20:54:34 GMT
    ;; MSG SIZE  rcvd: 120
    

    正则表达式是 ns\d+.google.es。如您所见,错误出现在正则表达式中,因为您正在使用该项目构建正则表达式,并且您要检查的域可以是 DNS 的其他域(这里我要求 google.es,但 DNS 使用 google.com)

    如果你想使用正则表达式,可以使用下面的ns\d+.+,结果如下:

    希望对你有帮助。

    【讨论】:

    • 不,它仍然不起作用,我得到相同的空字符串还有其他解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2011-05-25
    相关资源
    最近更新 更多