private static extern int DnsQuery( [MarshalAs(UnmanagedType.VBByRefStr)] ref string pszName, DnsRecordTypes wType, DnsQueryOptions options, ref IP4_ARRAY dnsServerIpArray, ref IntPtr ppQueryResults, int pReserved);
/// <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; }
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); }
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); }
internal static extern void ResolveDnsName(string hostname, DnsRecordTypes type, CallbackDelegate callback);
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); }
/// <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) { }
public static extern int DnsQueryWithServerIp([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpstrName, DnsRecordTypes wType, DnsQueryOptions Options, ref IP4_ARRAY dnsServerIpArray, ref IntPtr ppQueryResultsSet, IntPtr pReserved);
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()); }
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()); }
/// <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));
/// <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);
/// <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); } } }
/// <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); } } }
public static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpstrName, DnsRecordTypes wType, DnsQueryOptions Options, IntPtr pExtra, ref IntPtr ppQueryResultsSet, IntPtr pReserved);
public static extern int DnsQuery([In] string lpstrName, DnsRecordTypes wType, DnsQueryOptions Options, IntPtr pExtra, ref IntPtr ppQueryResultsSet, IntPtr pReserved);