通过PowerShell获取域名whois信息

Whois 简单来说,就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商、域名注册日期和过期日期等)。通过域名Whois服务器查询,可以查询域名归属者联系方式,以及注册和到期时间。通常情况下,whois信息均为真实信息,通过whois信息可以找到域名注册人的很多真实信息,像电话,邮箱,NS记录,是对网站进行社工非常好的信息来源,对于安全从业人员来说,快速获取whois信息,能够帮助自己掌握目标网站的很多有用信息。

而whois信息通常是保存在各级域名注册机构中,平常我们要查询whois信息都是通过godaddy、name.com、万网、新网等域名注册商网站通过查询页面提交域名进行查询,既慢又不能批量查询,太费劲了,这里我就把我珍藏很久的一个PS function贡献给大家,这个脚本支持140多种后缀的域名进行查询,尤其是一些生僻的域,找一个能支持这个域注册的注册商就不容易了,现在你不需要再为这个事情发愁了。

老规矩,先上代码,然后对关键操作进行解释:

        =====文件名:Get-whois.ps1=====
  Get-WhoIs {












 




    [CmdletBinding()]
    (

        [Parameter(Position=0, ValueFromRemainingArguments=$true)]
        []$query,


        []$server,


        []$NoForward
    )
     {
        $TLDs = DATA {
          @{

            =  ,
            =  ,
            =  ,
            =  ,
            =  
            =  
            =  
            =  
            =  
            =  ,
            =  
            =  
            =  
            =  
            =  
            =  
            =  ,
            =  
            =  ,,
            =  
              =  
            =  ,
            =  ,
            =  ,
                =  
              =  
            =  ,
            =  ,
            =  
            =  
            =  ,
            =
            =  
            =  ,
            =  
              =  
            =  
            =  ,,
            =  ,
            =  ,
            =  
            =  ,
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =
            =
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
            =  
          }
        }

        $EAP, $ErrorActionPreference = $ErrorActionPreference, 

        $query = $query.Trim()

        ($query  ) {
             
            ($query  ) {
                $query = 
            }
            (!$server) { $server =  }
        } (!$server) {
            $server = $TLDs.GetEnumerator() |
                 { $query   (+$_.name) } |
                 -Expand Value | Get-Random
        }

        (!$server) { $server =  }
        $maxRequery = 3 

         {
             
            $client =  System.Net.Sockets.TcpClient $server, 43

             {
                $stream = $client.GetStream()

                 
                $data = [System.Text.Encoding]::Ascii.GetBytes( $query +  )
                $stream.($data, 0, $data.Length)

                 
                $reader =  System.IO.StreamReader $stream, [System.Text.Encoding]::ASCII

                $result = $reader.ReadToEnd()

                ($result  ) {
                     
                    (!$NoForward) {
                         

                        (!$cachedResult) {
                            $cachedResult = $result
                            $cachedServer = $server
                        }
                        $server = $matches[1]
                        $query = ($query -split )[-1]
                        $maxRequery--
                    }  { $maxRequery = 0 }
                }  { $maxRequery = 0 }
            }  {
                ($stream) {
                    $stream.Close()
                    $stream.Dispose()
                }
            }
        }  ($maxRequery  0)

        $result

        ($cachedResult  ($result -split ).count  5) {
             
            $cachedResult
        }

        $ErrorActionPreference = $EAP
    }
 }

函数里定义了三个参数,两个[string]类型,一个[switch]类型,分别用于接收要进行whois查询的域名,指定whois域名服务器,以及是否允许将查询请求转发到其他域名解析服务器。随后创建了一个枚举值的哈希表,目的是用于存储不同域名后缀和whois服务器的对应关系,因为不同的域名后缀对应的域名信息是存储在不同的服务器上的。需要强调的是像.com、.net、.org、.info这几个注册量特别大的域名后缀指定了多个whois服务器,避免查询量过大无法有效返回结果的问题。

接下来通过New-Object创建一个System.Net.Sockets.TcpClient的TCP对象,连接上面指定的whois服务器的43端口用于查询whois信息,在通过一个System.IO.StreamReader对象接收whois信息返回的数据,并对数据进行解析。除此之外再加上try{}cache{}finally{}进行容错处理,在数据解析是也用到了正则表达式用于匹配目标字符串。

程序的运行方法有如下四种:

get-whois dnspod.com

先看看dnspod在被腾讯收购后有没有更改whois信息,貌似鹅厂没有改过

通过PowerShell获取域名whois信息_第1张图片
get-whois jd.com –NoForward

通过PowerShell获取域名whois信息_第2张图片
get-whois n 128.11.5.98 -server whois.arin.net

 通过PowerShell获取域名whois信息_第3张图片


作者: 付海军
出处:http://blog.csdn.net/fuhj02
版权:本文版权归作者和csdn共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://www.fuhaijun.com/

你可能感兴趣的:(PowerShell)