none
MX Record Lookup Function in Powershell RRS feed

  • Question

  • Hey Guys, I am looking to get a script running on a weekly basis that takes the information provided by the get-accepteddomain cmdlet and performs an MX lookup for each DomainName.  After the Script has performed the lookups I would like to have it e-mail the information.

    I've found a great function for getting the MX record information and it works great.  I'm struggling with how to perform a foreach with the function using data provided by the get-accepteddomain cmdlet and then e-mail the results.

    ####################
    ### Function to get the MX Records for a domain
    ### Usage: Get-DnsMXQuery -DomainName "gmail.com"
    ### Reference: http://serverfault.com/questions/164508/anyone-have-a-powershell-script-to-look-up-the-mx-record-for-a-domain

    function Get-DnsAddressList
    {
        param(
            [parameter(Mandatory=$true)][Alias("Host")]
              [string]$HostName)

        try {
            return [System.Net.Dns]::GetHostEntry($HostName).AddressList
        }
        catch [System.Net.Sockets.SocketException] {
            if ($_.Exception.ErrorCode -ne 11001) {
                throw $_
            }
            return = @()
        }
    }

    function Get-DnsMXQuery
    {
        param(
            [parameter(Mandatory=$true)]
              [string]$DomainName)

        if (-not $Script:global_dnsquery) {
            $Private:SourceCS = @'
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Runtime.InteropServices;

    namespace PM.Dns {
      public class MXQuery {
        [DllImport("dnsapi", EntryPoint="DnsQuery_W", CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
        private static extern int DnsQuery(
            [MarshalAs(UnmanagedType.VBByRefStr)]
            ref string pszName,
            ushort     wType,
            uint       options,
            IntPtr     aipServers,
            ref IntPtr ppQueryResults,
            IntPtr pReserved);

        [DllImport("dnsapi", CharSet=CharSet.Auto, SetLastError=true)]
        private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);

        public static string[] Resolve(string domain)
        {
            if (Environment.OSVersion.Platform != PlatformID.Win32NT)
                throw new NotSupportedException();

            List<string> list = new List<string>();

            IntPtr ptr1 = IntPtr.Zero;
            IntPtr ptr2 = IntPtr.Zero;
            int num1 = DnsQuery(ref domain, 15, 0, IntPtr.Zero, ref ptr1, IntPtr.Zero);
            if (num1 != 0)
                throw new Win32Exception(num1);
            try {
                MXRecord recMx;
                for (ptr2 = ptr1; !ptr2.Equals(IntPtr.Zero); ptr2 = recMx.pNext) {
                    recMx = (MXRecord)Marshal.PtrToStructure(ptr2, typeof(MXRecord));
                    if (recMx.wType == 15)
                        list.Add(Marshal.PtrToStringAuto(recMx.pNameExchange));
                }
            }
            finally {
                DnsRecordListFree(ptr1, 0);
            }

            return list.ToArray();
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct MXRecord
        {
            public IntPtr pNext;
            public string pName;
            public short  wType;
            public short  wDataLength;
            public int    flags;
            public int    dwTtl;
            public int    dwReserved;
            public IntPtr pNameExchange;
            public short  wPreference;
            public short  Pad;
        }
      }
    }
    '@

            Add-Type -TypeDefinition $Private:SourceCS -ErrorAction Stop
            $Script:global_dnsquery = $true
        }

        [PM.Dns.MXQuery]::Resolve($DomainName) | % {
            $rec = New-Object PSObject
            Add-Member -InputObject $rec -MemberType NoteProperty -Name "Host"        -Value $_
            Add-Member -InputObject $rec -MemberType NoteProperty -Name "AddressList" -Value $(Get-DnsAddressList $_)
            $rec
        }
    }

    ### END Function
    ##################################

    The funtion above does a great job of pulling the mx records for a domain

    Example Output:

    [PS] C:\>Get-DnsMXQuery -DomainName godaddy.com

    Host                                                                       AddressList
    ----                                                                       -----------
    mailstore1.secureserver.net                                                216.69.186.201
    smtp.secureserver.net                                                      216.69.186.201

    Example Output "Get-AcceptedDomain

    [PS] C:\>Get-AcceptedDomain

    Name                           DomainName                     DomainType                                  Default
    ----                           ----------                     ----------                                  -------
    Godaddy.com                    Godaddy.com                    Authoritative                               True

    Warmest Regards,

    Kelsey

    Wednesday, February 8, 2012 5:45 PM

Answers

All replies