NSLookup在c#

时间:2017-03-12 21:41:21

标签: c# dns nameservers nslookup

我正在使用这个c# librabry来查找域名的名称服务器。这是我的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

任何帮助都会非常感激

提前致谢!

2 个答案:

答案 0 :(得分:1)

绝对不需要再次通过regex从result.AuditTrail属性中提取信息。 AuditTrail仅用于记录信息!您想要的所有数据都已存在于结果中,DnsClient.NET库为您提供了强类型的结果。

This is所有你回到结果中。答案,权限等列表......

DnsQueryResponse是您应该使用的实际DNS结果。 根据您提出的问题,相关数据可能位于答案,附加条件或权限中。

你的错误是(查看注释代码),你试图检查所有记录上的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.

希望有所帮助

答案 1 :(得分:0)

您需要从

更改正则表达式

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 +。+ ,结果如下: enter image description here

我希望这可以帮到你。