Esempio n. 1
0
 private static extern int DnsQuery(
     [MarshalAs(UnmanagedType.VBByRefStr)] ref string pszName,
     DnsRecordTypes wType,
     DnsQueryOptions options,
     ref IP4_ARRAY dnsServerIpArray,
     ref IntPtr ppQueryResults,
     int pReserved);
Esempio n. 2
0
        /// <summary>
        /// Constructs a new instance of <see cref="DnsRecord"/>.
        /// </summary>
        /// <param name="zone">Associated zone</param>
        /// <param name="name">Owner name</param>
        /// <param name="type">Record type</param>
        /// <param name="class">Record class</param>
        /// <param name="timeToLive">Record time to live (TTL)</param>
        public DnsRecord(DnsZone zone, string name, DnsRecordTypes type, DnsRecordClasses @class, TimeSpan timeToLive)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (timeToLive.Ticks < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(timeToLive));
            }

            Zone       = zone;
            Name       = name;
            Type       = type;
            Class      = @class;
            TimeToLive = timeToLive;
        }
Esempio n. 3
0
        internal static List <string> GetRecords(string domain,
                                                 DnsRecordTypes recordType,
                                                 DnsQueryOptions options = DEFAULT_QUERY_OPTIONS)
        {
            var recordsArray = IntPtr.Zero;
            var records      = new List <string>();

            try
            {
                var result = NativeMethods.DnsQuery(
                    domain,
                    recordType,
                    options,
                    IntPtr.Zero,
                    ref recordsArray,
                    IntPtr.Zero);

                if (result != 0)
                {
                    return(records);
                }

                DNS_RECORD record;

                for (var recordPtr = recordsArray; !recordPtr.Equals(IntPtr.Zero); recordPtr = record.pNext)
                {
                    record = (DNS_RECORD)Marshal.PtrToStructure(recordPtr, typeof(DNS_RECORD));
                    if (record.wType == (int)recordType)
                    {
                        var item = Marshal.PtrToStringAuto(record.Data.PTR.pNameHost);
                        records.Add(item);
                    }
                }
            }
            finally
            {
                if (recordsArray != IntPtr.Zero)
                {
                    NativeMethods.DnsRecordListFree(recordsArray, DNS_FREE_TYPE.DnsFreeFlat);
                }
            }

            return(records);
        }
Esempio n. 4
0
        internal static List <IPAddress> GetARecords(string domain, DnsQueryOptions options = DEFAULT_QUERY_OPTIONS)
        {
            var recordsArray = IntPtr.Zero;
            var records      = new List <IPAddress>();
            const DnsRecordTypes queryType = DnsRecordTypes.DNS_TYPE_A;

            try
            {
                var result = NativeMethods.DnsQuery(
                    domain,
                    queryType,
                    options,
                    IntPtr.Zero,
                    ref recordsArray,
                    IntPtr.Zero);

                if (result != 0)
                {
                    return(records);
                }

                DNS_RECORD record;

                for (var recordPtr = recordsArray; !recordPtr.Equals(IntPtr.Zero); recordPtr = record.pNext)
                {
                    record = (DNS_RECORD)Marshal.PtrToStructure(recordPtr, typeof(DNS_RECORD));
                    if (record.wType == (int)queryType)
                    {
                        var ip = record.Data.A.IPAddressObject;
                        records.Add(ip);
                    }
                }
            }
            finally
            {
                if (recordsArray != IntPtr.Zero)
                {
                    NativeMethods.DnsRecordListFree(recordsArray, DNS_FREE_TYPE.DnsFreeFlat);
                }
            }

            return(records);
        }
Esempio n. 5
0
 internal static extern void ResolveDnsName(string hostname, DnsRecordTypes type, CallbackDelegate callback);
Esempio n. 6
0
        static async Task <Tuple <string, uint> > GetHostAddressAsync(string hostname, DnsRecordTypes type = DnsRecordTypes.DNS_TYPE_A)
        {
            var taskWrapper = new TaskCompletionSource <Tuple <string, uint> >();
            var callback    = new CallbackDelegate(
                (status, ipAddress, ttl) =>
            {
                if (status != 0)
                {
                    taskWrapper.SetException(new Exception($"DNS query for {hostname} failed. ErrorCode: {status}"));
                    return;
                }

                taskWrapper.SetResult(Tuple.Create(ipAddress, ttl));
            });

            ResolveDnsName(hostname, type, callback);
            return(await taskWrapper.Task);
        }
Esempio n. 7
0
 /// <summary>
 /// Constructs a new instance of <see cref="DnsRecord"/>.
 /// </summary>
 /// <param name="name">Owner name</param>
 /// <param name="type">Record type</param>
 /// <param name="class">Record class</param>
 /// <param name="timeToLive">Record time to live (TTL)</param>
 public DnsRecord(string name, DnsRecordTypes type, DnsRecordClasses @class, TimeSpan timeToLive)
     : this(zone : null, name, type, @class, timeToLive)
 {
 }
Esempio n. 8
0
 public static extern int DnsQueryWithServerIp([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpstrName, DnsRecordTypes wType,
                                               DnsQueryOptions Options, ref IP4_ARRAY dnsServerIpArray, ref IntPtr ppQueryResultsSet, IntPtr pReserved);
Esempio n. 9
0
            public static IDictionary <string, object>[] QueryDNSForRecordTypeSpecificNameServers(string domainName, IPEndPoint[] dnsServers, DnsRecordTypes recordType)
            {
                if (dnsServers == null || dnsServers.Length == 0)
                {
                    throw new Exception("At least one DNS Server must be provided to do the query");
                }

                IntPtr dnsRequest, addrRequestBuffer, contextBuffer;

                QueryCompletionContext context = new QueryCompletionContext();

                context.eventHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                context.requestType = recordType;
                context.resultCode  = Marshal.AllocHGlobal(Marshal.SizeOf <int>());

                List <IDictionary <string, object> > dnsRecords = new List <IDictionary <string, object> >();

                GCHandle handle = GCHandle.Alloc(dnsRecords, GCHandleType.Normal);

                context.dnsRecords = GCHandle.ToIntPtr(handle);

                MakeDnsRequest(domainName, dnsServers, context, out dnsRequest, out addrRequestBuffer, out contextBuffer);

                DNSQueryResult queryResult = new DNSQueryResult();

                queryResult.Version = DnsQueryRequestVersion1;

                IntPtr result = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(DNSQueryResult)));

                Marshal.StructureToPtr(queryResult, result, false);

                IntPtr cancelBuffer = Marshal.AllocHGlobal(DNSQueryCancelSize);

                int resCode = DnsQueryEx(dnsRequest, result, cancelBuffer);

                FreeDnsRequest(dnsRequest, addrRequestBuffer, contextBuffer);

                bool requestPending = false;

                switch (resCode)
                {
                case 0:
                {
                    queryResult = (DNSQueryResult)Marshal.PtrToStructure(result, typeof(DNSQueryResult));
                    Marshal.FreeHGlobal(result);
                }

                break;

                case DnsRequestPending:
                {
                    Marshal.FreeHGlobal(result);
                    requestPending = true;
                }
                break;

                case DnsRecordsNoInfo:
                {
                    Marshal.FreeHGlobal(result);
                    Marshal.FreeHGlobal(cancelBuffer);
                    handle.Free();
                    return(new Dictionary <string, object> [0]);
                }

                default:
                {
                    Marshal.FreeHGlobal(result);
                    Marshal.FreeHGlobal(cancelBuffer);
                    handle.Free();
                    throw new Win32Exception(resCode);
                }
                }

                if (!requestPending)
                {
                    Marshal.FreeHGlobal(cancelBuffer);
                    handle.Free();

                    if (queryResult.QueryStatus != 0)
                    {
                        if (queryResult.QueryRecords != IntPtr.Zero)
                        {
                            DnsRecordListFree(queryResult.QueryRecords, DNS_FREE_TYPE.DnsFreeRecordList);
                        }

                        throw new Win32Exception(queryResult.QueryStatus);
                    }

                    dnsRecords.AddRange(ParseRecords(queryResult.QueryRecords, recordType));

                    if (queryResult.QueryRecords != IntPtr.Zero)
                    {
                        DnsRecordListFree(queryResult.QueryRecords, DNS_FREE_TYPE.DnsFreeRecordList);
                    }

                    return(dnsRecords.ToArray());
                }

                if (!context.eventHandle.WaitOne(5000))
                {
                    resCode = DnsCancelQuery(cancelBuffer);
                    context.eventHandle.WaitOne();
                    if (resCode != 0)
                    {
                        Marshal.FreeHGlobal(cancelBuffer);
                        handle.Free();
                        throw new Win32Exception(resCode);
                    }
                }

                Marshal.FreeHGlobal(cancelBuffer);

                handle.Free();

                int retCode = Marshal.ReadInt32(context.resultCode);

                Marshal.FreeHGlobal(context.resultCode);

                if (retCode != 0)
                {
                    throw new Win32Exception(retCode);
                }

                return(dnsRecords.ToArray());
            }
Esempio n. 10
0
            private static IDictionary <string, object>[] ParseRecords(IntPtr result, DnsRecordTypes recordTypeAskedFor)
            {
                DNS_RECORD?record = Marshal.PtrToStructure(result, typeof(DNS_RECORD)) as DNS_RECORD?;

                List <IDictionary <string, object> > records = new List <IDictionary <string, object> >();

                while (record.HasValue)
                {
                    if (record.Value.Type == (ushort)recordTypeAskedFor)
                    {
                        string recordName = Marshal.PtrToStringUni(record.Value.Name);
                        switch (record.Value.Type)
                        {
                        case (ushort)DnsRecordTypes.DNS_TYPE_A:
                        {
                            string recordValue = ConvertUintToIpAddress(record.Value.Data.A.IpAddress).ToString();
                            records.Add(new Dictionary <string, object> {
                                    { "Type", "A" }, { "Name", recordName }, { "Value", recordValue }
                                });
                            break;
                        }

                        case (ushort)DnsRecordTypes.DNS_TYPE_MX:
                        {
                            string nameExchange = Marshal.PtrToStringUni(record.Value.Data.MX.NameExchange);
                            ushort preference   = record.Value.Data.MX.Preference;
                            records.Add(new Dictionary <string, object> {
                                    { "Type", "MX" }, { "Name", recordName }, { "NameExchange", nameExchange }, { "Preference", preference.ToString() }
                                });
                            break;
                        }

                        case (ushort)DnsRecordTypes.DNS_TYPE_NS:
                        case (ushort)DnsRecordTypes.DNS_TYPE_PTR:
                        case (ushort)DnsRecordTypes.DNS_TYPE_CNAME:
                        {
                            string type = record.Value.Type == (ushort)DnsRecordTypes.DNS_TYPE_NS ? "NS " :
                                          (record.Value.Type == (ushort)DnsRecordTypes.DNS_TYPE_PTR ? "PTR" : "CNAME");
                            string nameHost = Marshal.PtrToStringUni(record.Value.Data.PTR.NameHost);
                            records.Add(new Dictionary <string, object> {
                                    { "Type", type }, { "Name", recordName }, { "NameHost", nameHost }
                                });
                            break;
                        }

                        case (ushort)DnsRecordTypes.DNS_TYPE_TXT:
                        {
                            IntPtr stringsCursor = record.Value.Data.TXT.StringArray;

                            StringBuilder valuesBuffer = new StringBuilder();

                            for (uint i = 0; i < record.Value.Data.TXT.StringCount; i++)
                            {
                                IntPtr txtString = Marshal.ReadIntPtr(stringsCursor);

                                string value = Marshal.PtrToStringUni(stringsCursor);

                                IDictionary <string, object> txtRecord = new Dictionary <string, object>();
                                txtRecord.Add("Type", "TXT");
                                txtRecord.Add("Name", recordName);
                                txtRecord.Add("Value", value);
                                records.Add(txtRecord);

                                valuesBuffer.Append(";" + value);

                                stringsCursor += Marshal.SizeOf(typeof(IntPtr));
                            }

                            break;
                        }

                        case (ushort)DnsRecordTypes.DNS_TYPE_AAAA:
                        {
                            string recordValue = ConvertAAAAToIpAddress(record.Value.Data.AAAA).ToString();
                            records.Add(new Dictionary <string, object> {
                                    { "Type", "AAAA" }, { "Name", recordName }, { "Value", recordValue }
                                });
                            break;
                        }

                        case (ushort)DnsRecordTypes.DNS_TYPE_SRV:
                        {
                            string nameTarget = Marshal.PtrToStringUni(record.Value.Data.SRV.NameTarget);
                            ushort priority   = record.Value.Data.SRV.Priority;
                            ushort weight     = record.Value.Data.SRV.Weight;
                            ushort port       = record.Value.Data.SRV.Port;
                            records.Add(new Dictionary <string, object> {
                                    { "Type", "SRV" }, { "Name", recordName }, { "NameTarget", nameTarget }, { "Priority", priority.ToString() }, { "Weight", weight.ToString() }, { "Port", port.ToString() }
                                });
                            break;
                        }
                        }
                    }

                    record = Marshal.PtrToStructure(record.Value.Next, typeof(DNS_RECORD)) as DNS_RECORD?;
                }

                return(records.ToArray());
            }
Esempio n. 11
0
 /// <summary>
 /// Retrieves DNS records by record type and name
 /// </summary>
 /// <param name="recordType">Type of records to be retrieved</param>
 /// <param name="name">Owner name</param>
 /// <returns>List of DNS records</returns>
 public virtual IEnumerable <DnsRecord> GetRecords(DnsRecordTypes recordType, string name)
 => Records.Where(r => r.Type == recordType && string.Equals(r.Name, name, StringComparison.OrdinalIgnoreCase));
Esempio n. 12
0
 /// <summary>
 /// Retrieves DNS records by record type
 /// </summary>
 /// <param name="recordType">Type of records to be retrieved</param>
 /// <returns>List of DNS records</returns>
 public virtual IEnumerable <DnsRecord> GetRecords(DnsRecordTypes recordType)
 => Records.Where(r => r.Type == recordType);
Esempio n. 13
0
 /// <summary>
 /// Searches for DNS records of a given type
 /// </summary>
 /// <param name="recordType">Record type to restrict the search</param>
 /// <param name="query">Text query to search</param>
 /// <returns>List of records matching the query</returns>
 public virtual IEnumerable <DnsRecord> SearchRecords(DnsRecordTypes recordType, string query)
 => Records.Where(r => r.Type == recordType && r.ToString().IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0);
        /// <summary>
        /// Query host based on type
        /// </summary>
        /// <param name="domain">Domain to query</param>
        /// <param name="type">Query type</param>
        /// <returns>List of records</returns>
        public static CommandResult GetRecords(string domain, string type)
        {
            if (Environment.OSVersion.Platform != PlatformID.Win32NT)
            {
                throw new NotSupportedException();
            }

            CommandResult  results   = new CommandResult();
            DnsRecordTypes queryType = (DnsRecordTypes)recordTypes[type];

            var recordsArray = IntPtr.Zero;

            try
            {
                var result = DnsQuery(ref domain, queryType, DnsQueryOptions.DNS_QUERY_BYPASS_CACHE, IntPtr.Zero, ref recordsArray, IntPtr.Zero);
                if (result != 0)
                {
                    throw new Win32Exception(result);
                }

                DNS_RECORD record;
                var        recordList = new List <string>();
                for (var recordPtr = recordsArray; !recordPtr.Equals(IntPtr.Zero); recordPtr = record.pNext)
                {
                    record = (DNS_RECORD)Marshal.PtrToStructure(recordPtr, typeof(DNS_RECORD));
                    switch (record.wType)
                    {
                    case (ushort)DnsRecordTypes.DNS_TYPE_A:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "A" },
                            { "IPAddress", ConvertUintToIpAddressString(record.Data.A.IpAddress) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_NS:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "NS" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.NS.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MD:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MD" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MD.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MF:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MF" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MF.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_CNAME:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "CNAME" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.CNAME.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_SOA:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "SOA" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.SOA.pNamePrimaryServer) }
                        }
                            );
                        break;

                    //message.Format("   SOA %s  nameserv: %s\r\n", record->pName, record.Data.SOA.pNamePrimaryServer);

                    //temp.Format("              admin: %s\r\n", record.Data.SOA.pNameAdministrator);
                    //message += temp;
                    //temp.Format("             serial: %u\r\n", record.Data.SOA.dwSerialNo);
                    //message += temp;
                    //temp.Format("            refresh: %u\r\n", record.Data.SOA.dwRefresh);
                    //message += temp;
                    //temp.Format("                ttl: %u\r\n", record.Data.SOA.dwDefaultTtl);
                    //message += temp;
                    //temp.Format("             expire: %u\r\n", record.Data.SOA.dwExpire);
                    //message += temp;
                    //temp.Format("              retry: %u", record.Data.SOA.dwRetry);
                    //message += temp;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MB:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MB" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MB.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MG:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MG" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MG.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MR:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MR" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MR.pNameHost) }
                        }
                            );
                        break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_NULL:
                    //  message.Format("   MB %s %s",record->pName,record.Data.Null.MR.pNameHost);
                    //break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_WKS:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "WKS" },
                            { "Protocol", ((int)record.Data.WKS.chProtocol).ToString() },
                            { "Mask", ((int)record.Data.WKS.BitMask).ToString() },
                            { "IPAddress", ConvertUintToIpAddressString(record.Data.WKS.IpAddress) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_PTR:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "PTR" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.PTR.pNameHost) }
                        }
                            );
                        break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_HINFO:
                    //    message.Format("   HINFO %s", record->pName);
                    //    for (u_int i = 0; i < record.Data.HINFO.dwStringCount; i++)
                    //    {
                    //        message += "\r\n            ";
                    //        message += record.Data.HINFO.pStringArray[i];
                    //    }
                    //    break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_MINFO:
                    //    message.Format("   MINFO %s err: %s name: %s", record->pName, record.Data.MINFO.pNameErrorsMailbox, record.Data.MINFO.pNameMailbox);
                    //    break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MX:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MX" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MX.pNameExchange) },
                            { "Preference", record.Data.MX.wPreference.ToString() }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_TEXT:
                        for (uint i = 0; i < record.Data.TXT.dwStringCount; i++)
                        {
                            results.Add(
                                new ResultRecord()
                            {
                                { "Name", Marshal.PtrToStringAuto(record.pName) },
                                { "Type", "TXT" },
                                { "Strings", Marshal.PtrToStringAuto(record.Data.TXT.pStringArray) },
                            }
                                );
                        }
                        break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_RP:
                    //    message.Format("   RP %s err: %s name: %s", record->pName, record.Data.RP.pNameErrorsMailbox, record.Data.RP.pNameMailbox);
                    //    break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_AFSDB:
                    //    message.Format("   AFSDB %s %s pref: %d", record->pName, record.Data.AFSDB.pNameExchange, record.Data.AFSDB.wPreference);
                    //    break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_X25:
                    //    message.Format("   X25 %s", record->pName);
                    //    for (u_int i = 0; i < record.Data.X25.dwStringCount; i++)
                    //    {
                    //        message += "\r\n            ";
                    //        message += record.Data.X25.pStringArray[i];
                    //    }
                    //    break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_ISDN:
                    //    message.Format("   ISDN %s", record->pName);
                    //    for (u_int i = 0; i < record.Data.ISDN.dwStringCount; i++)
                    //    {
                    //        message += "\r\n            ";
                    //        message += record.Data.ISDN.pStringArray[i];
                    //    }
                    //    break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_RT:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "RT" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.RT.pNameExchange) },
                            { "Preference", record.Data.RT.wPreference.ToString() }
                        }
                            );
                        break;


                    //case (ushort)DnsRecordTypes.DNS_TYPE_SIG:
                    //break;
                    //case (ushort)DnsRecordTypes.DNS_TYPE_KEY:
                    //break;


                    case (ushort)DnsRecordTypes.DNS_TYPE_AAAA:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "AAAA" },
                            { "IPAddress", ConvertAAAAToIpAddress(record.Data.AAAA).ToString() }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_SRV:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "SRV" },
                            { "PrimaryServer", Marshal.PtrToStringAuto(record.Data.SRV.pNameTarget) },
                        }
                            );
                        break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_WINS:
                    //break;

                    //case (ushort)DnsRecordTypes.DNS_TYPE_WINSR:
                    //    message.Format("   NBSTAT %s %s", record->pName, record.Data.WINSR.pNameResultDomain);
                    //    break;

                    default:
                        throw new Exception(string.Format("Unknown: %s type %d", record.pName, record.wType));
                    }

                    //if (record->Flags.S.Section == DNSREC_AUTHORITY)
                    //    message += "   (authority)";
                    //if (record->Flags.S.Section == DNSREC_ADDITIONAL)
                    //    message += "   (additional)";

                    //pEdit->SetSel(pEdit->GetWindowTextLength(), pEdit->GetWindowTextLength());
                    //pEdit->ReplaceSel(message + "\r\n");


                    //Console.WriteLine(Marshal.PtrToStringAnsi(record.pName));
                    if (record.wType == (int)DnsRecordTypes.DNS_TYPE_MX)
                    {
                        recordList.Add(Marshal.PtrToStringAuto(record.Data.MX.pNameExchange));
                    }
                }

                return(results);
            }
            finally
            {
                if (recordsArray != IntPtr.Zero)
                {
                    DnsRecordListFree(recordsArray, DNS_FREE_TYPE.DnsFreeFlat);
                }
            }
        }
Esempio n. 15
0
        /// <summary>
        /// Query host based on type
        /// </summary>
        /// <param name="domain">Domain to query</param>
        /// <param name="type">Query type</param>
        /// <returns>List of records</returns>
        public static CommandResult GetRecords(string domain, string type)
        {
            if (Environment.OSVersion.Platform != PlatformID.Win32NT)
            {
                throw new NotSupportedException();
            }

            CommandResult results   = new CommandResult();
            object        foundType = RecordTypes[type];

            if (foundType == null)
            {
                string[] types = new string[RecordTypes.Count];
                RecordTypes.Keys.CopyTo(types, 0);
                throw new NoPowerShellException("Invalid type specified. Specify one of the following: {0}.", string.Join(",", types));
            }
            DnsRecordTypes queryType = (DnsRecordTypes)foundType;

            var recordsArray = IntPtr.Zero;

            try
            {
                var result = DnsQuery(ref domain, queryType, DnsQueryOptions.DNS_QUERY_BYPASS_CACHE, IntPtr.Zero, ref recordsArray, IntPtr.Zero);
                if (result != 0)
                {
                    throw new Win32Exception(result);
                }

                DNS_RECORD record;
                for (var recordPtr = recordsArray; !recordPtr.Equals(IntPtr.Zero); recordPtr = record.pNext)
                {
                    record = (DNS_RECORD)Marshal.PtrToStructure(recordPtr, typeof(DNS_RECORD));
                    switch (record.wType)
                    {
                    case (ushort)DnsRecordTypes.DNS_TYPE_A:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "A" },
                            { "IPAddress", ConvertUintToIpAddressString(record.Data.A.IpAddress) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_NS:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "NS" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.NS.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MD:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MD" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MD.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MF:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MF" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MF.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_CNAME:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "CNAME" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.CNAME.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_SOA:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "SOA" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.SOA.pNamePrimaryServer) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MB:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MB" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MB.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MG:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MG" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MG.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MR:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MR" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MR.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_WKS:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "WKS" },
                            { "Protocol", ((int)record.Data.WKS.chProtocol).ToString() },
                            { "Mask", ((int)record.Data.WKS.BitMask).ToString() },
                            { "IPAddress", ConvertUintToIpAddressString(record.Data.WKS.IpAddress) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_PTR:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "PTR" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.PTR.pNameHost) }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_MX:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "MX" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.MX.pNameExchange) },
                            { "Preference", record.Data.MX.wPreference.ToString() }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_TEXT:
                        for (uint i = 0; i < record.Data.TXT.dwStringCount; i++)
                        {
                            results.Add(
                                new ResultRecord()
                            {
                                { "Name", Marshal.PtrToStringAuto(record.pName) },
                                { "Type", "TXT" },
                                { "Strings", Marshal.PtrToStringAuto(record.Data.TXT.pStringArray) },
                            }
                                );
                        }
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_RT:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "RT" },
                            { "NameHost", Marshal.PtrToStringAuto(record.Data.RT.pNameExchange) },
                            { "Preference", record.Data.RT.wPreference.ToString() }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_AAAA:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "AAAA" },
                            { "IPAddress", ConvertAAAAToIpAddress(record.Data.AAAA).ToString() }
                        }
                            );
                        break;

                    case (ushort)DnsRecordTypes.DNS_TYPE_SRV:
                        results.Add(
                            new ResultRecord()
                        {
                            { "Name", Marshal.PtrToStringAuto(record.pName) },
                            { "Type", "SRV" },
                            { "PrimaryServer", Marshal.PtrToStringAuto(record.Data.SRV.pNameTarget) },
                        }
                            );
                        break;

                    default:
                        throw new Exception(string.Format("Unknown: %s type %d", record.pName, record.wType));
                    }
                }

                return(results);
            }
            finally
            {
                if (recordsArray != IntPtr.Zero)
                {
                    DnsRecordListFree(recordsArray, DNS_FREE_TYPE.DnsFreeFlat);
                }
            }
        }
Esempio n. 16
0
 public static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpstrName, DnsRecordTypes wType,
                                   DnsQueryOptions Options, IntPtr pExtra, ref IntPtr ppQueryResultsSet, IntPtr pReserved);
Esempio n. 17
0
 public static extern int DnsQuery([In] string lpstrName, DnsRecordTypes wType, DnsQueryOptions Options, IntPtr pExtra, ref IntPtr ppQueryResultsSet, IntPtr pReserved);