Public/Internet/Get-RegistrarInfo.ps1

<#
Copyright © 2024 Integris. For internal company use only. All rights reserved.
#>


FUNCTION Get-RegistrarInfo {

    <#
    .SYNOPSIS
    Retrieves registrar information for a domain.
 
    .DESCRIPTION
    Retrieves registrar information for a domain.
 
    .PARAMETER Domain
    Specifies the domains to retrieve registrar info for.
 
    .EXAMPLE
    Get-StorageInfo IntegrisIT.com
 
    This command retrieves and displays registrar information for the specified domain(s).
 
    #>


    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [ValidateScript({
                if ($_ -match "^\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b$") {
                    $true
                }
                else {
                    throw "Invalid FQDN format."
                }
            })]
        [STRING[]]$Domain
    )
        
    $whoisPort = 43
    $OutputFormat = "summary"

    FUNCTION Find-WhoisServer {
        [CmdletBinding()]
        param (
            [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
            [ValidateScript({
                    if ($_ -match "^\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b$") {
                        $true
                    }
                    else {
                        throw "Invalid DomainName format."
                    }
                })]
            [string]$Domain
        )

        $tld = $Entry.Split(".")[-1]
        $whoisDnsServersForTld = Resolve-DnsName "$tld.whois-servers.net" | Select-Object -Property *
        $whoisDnsServersForTld | Where-Object IPAddress
    }

    $TotalCount = $Domain.Count
    $CurrentCount = 0
    $Results = @()

    FOREACH ($Entry in $Domain) {

        Write-IntegrisProgressBar -TotalCount $TotalCount -CurrentCount $CurrentCount -Activity "Getting Registrar Info" -Status "Getting Registrar Info for [$Entry]" -ID 345916832 
        $CurrentCount++ 

        if (-NOT $whoisServer) {
                # Set the appropriate WHOIS server and port based on the TLD of the domain name
                $whoisDnsServers = Find-WhoisServer -Domain $Entry
                $wServer = $whoisDnsServers | Where-Object IP4Address | Select-Object -first 1
            }
        else {
                $wServer = Resolve-DnsName $whoisServer | Where-Object IP4Address | Select-Object -first 1
            }

        # Get the IP address of the WHOIS server
        $wServerIP = ($wServer | Where-Object IP4Address).IP4Address | Select-Object -first 1
        # Get the name of the WHOIS server
        $wServerName = ($wServer | Where-Object IP4Address | Select-Object -first 1).Name
        # Query the WHOIS server for the domain name
        $whoisQuery = $Entry + "`r`n"
        $whoisSocket = New-Object System.Net.Sockets.TcpClient($wServerIP, $whoisPort)
        $whoisStream = $whoisSocket.GetStream()
        $whoisWriter = New-Object System.IO.StreamWriter($whoisStream)
        $whoisWriter.WriteLine($whoisQuery)
        $whoisWriter.Flush()
        $whoisReader = New-Object System.IO.StreamReader($whoisStream)
        $whoisResponse = $whoisReader.ReadToEnd()
        $whoisReader.Close()
        $whoisWriter.Close()
        $whoisSocket.Close()
        if ($OutputFormat -eq "summary") {
            # Remove blank lines
            $whoisResponse = $whoisResponse -replace "`r`n`r`n", "`r`n"
            # Split whoisResponse into lines and parse the WHOIS response for the basic information
            $whoisResponse = $whoisResponse -split "`r`n"
            $Registrar = $whoisResponse | Select-String -Pattern "Registrar: " | Select-Object -First 1
            $Registrar = $registrar -replace "Registrar:", ""
            $Registrar = $registrar -replace "[\s-[\r\n]]+", ""
            Try {
                $CreationDate = $whoisResponse | Select-String -Pattern "Creation Date: " | Select-Object -First 1
                $CreationDate = $CreationDate -replace "Creation Date:", ""
                $CreationDate = Get-Date $CreationDate
            }
            CATCH {
                $CreationDate = $whoisResponse.Split("`r`n") | Select-String -Pattern "Domain record activated: " | Select-Object -First 1
                $CreationDate = ($CreationDate.ToString() -Replace ("Domain record activated:",""))
                $CreationDate = ($CreationDate -Replace (" ",""))
                $CreationDate = Get-Date $CreationDate
            }
            Try {
            $ExpirationDate = $whoisResponse | Select-String -Pattern "Registry Expiry Date: " | Select-Object -First 1
            $ExpirationDate = $ExpirationDate -replace "Registry Expiry Date:", ""
            $ExpirationDate = Get-Date $ExpirationDate
            } Catch { }
            try { $DaysUntilExpiration = (New-TimeSpan -Start (Get-Date) -End (Get-Date $ExpirationDate)).Days } catch { }
            $NameServers = $whoisResponse | Select-String -Pattern "Name Server: " | Select-Object -Unique
            $NameServers = $NameServers -replace "Name Server:", ""
            $NameServers = $NameServers -replace "[\s-[\r\n]]+", ""
            $Results += New-Object PSObject -WarningAction SilentlyContinue -Property @{
                PSTypeName          = 'IntegrisPowerShell.RegistrarInfo'
                Domain              = $Entry
                Registrar           = $Registrar
                CreationDate        = $CreationDate
                ExpirationDays      = $DaysUntilExpiration
                ExpirationDate      = $ExpirationDate
                NameServers         = @($NameServers)
                WhoisServerName     = $wServerName
            }
        }
    }

    Write-Progress -PercentComplete 100 -Activity "Getting Registrar Info" -Status "Getting Registrar Info for [$Entry]" -ID 345916832 -Completed

    RETURN $Results
}