从MSSQL填充的DataGridView中实现IP转DNS的方法?
把IP地址转换为DNS域名的两种实用方案
嘿,我看你现在是用SQL查询填充DataGridView,想要把解析出来的IP地址转成对应的DNS域名对吧?这里有两种方案,我优先推荐你用C#代码层处理的方式,更灵活也更安全:
方案一:在C#代码中处理(推荐)
在应用层做反向DNS解析会比在SQL端处理更可控,还能避免数据库层面的安全风险,步骤很清晰:
简化你的SQL查询:先把存储的分段IP转成标准的IP字符串就行,不用原来那么多层嵌套的CAST,简化后的SQL如下:
SELECT TOP(10) -- 拼接成标准Source IP CAST(SUBSTRING([nSrcIPAddress], 1, 1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress], 2, 1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress], 3, 1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress], 4, 1) AS INT) AS SourceIP, -- 同理拼接Destination IP CAST(SUBSTRING([nDstIPAddress], 1, 1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress], 2, 1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress], 3, 1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress], 4, 1) AS INT) AS DestinationIP FROM 你的表名称在C#中解析DNS并绑定数据:修改你的
btnGo_Click方法,先获取IP数据,再逐个解析域名,还要处理解析失败的情况(毕竟不是所有IP都有反向DNS记录):using System.Net; // 别忘了引用这个命名空间 using System.Data.SqlClient; using System.Data; private void btnGo_Click(object sender, EventArgs e) { string connStr = "你的数据库连接字符串"; string query = @"SELECT TOP(10) CAST(SUBSTRING([nSrcIPAddress],1,1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress],2,1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress],3,1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress],4,1) AS INT) AS SourceIP, CAST(SUBSTRING([nDstIPAddress],1,1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress],2,1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress],3,1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress],4,1) AS INT) AS DestinationIP FROM 你的表名称"; DataTable dataTable = new DataTable(); // 用using确保资源自动释放 using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(query, conn)) { dataTable.Load(cmd.ExecuteReader()); } } // 给DataTable添加域名列 dataTable.Columns.Add("SourceDomain", typeof(string)); dataTable.Columns.Add("DestinationDomain", typeof(string)); // 遍历每行解析DNS foreach (DataRow row in dataTable.Rows) { string sourceIp = row["SourceIP"].ToString(); try { IPHostEntry hostEntry = Dns.GetHostEntry(sourceIp); row["SourceDomain"] = hostEntry.HostName; } catch (SocketException) { // 解析失败时显示原IP并标注 row["SourceDomain"] = $"{sourceIp} (无反向DNS记录)"; } string destIp = row["DestinationIP"].ToString(); try { IPHostEntry hostEntry = Dns.GetHostEntry(destIp); row["DestinationDomain"] = hostEntry.HostName; } catch (SocketException) { row["DestinationDomain"] = $"{destIp} (无反向DNS记录)"; } } // 绑定到DataGridView dataGridView1.DataSource = dataTable; }
方案二:在SQL中处理(不推荐,有局限性)
如果你一定要在SQL层面完成解析,也有办法,但要注意安全和性能问题:
子方案1:使用CLR集成函数
SQL Server本身没有内置的反向DNS函数,你可以通过CLR集成来扩展:
- 先写一个C#类库,实现反向解析的逻辑:
using System; using System.Data.SqlTypes; using System.Net; using Microsoft.SqlServer.Server; public class DnsHelper { [SqlFunction(DataAccess = DataAccessKind.None)] public static SqlString ReverseLookup(SqlString ipAddress) { if (ipAddress.IsNull) return SqlString.Null; try { IPHostEntry entry = Dns.GetHostEntry(ipAddress.Value); return new SqlString(entry.HostName); } catch { // 解析失败返回原IP return ipAddress; } } } - 编译成DLL后,在SQL Server中注册并创建函数:
-- 先启用CLR集成 sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE; -- 注册你的CLR程序集(替换成实际的DLL路径) CREATE ASSEMBLY DnsHelperAssembly FROM 'C:\YourPath\DnsHelper.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS; -- 创建可调用的SQL函数 CREATE FUNCTION dbo.ReverseDns(@ip NVARCHAR(15)) RETURNS NVARCHAR(255) AS EXTERNAL NAME DnsHelperAssembly.DnsHelper.ReverseLookup; - 然后在你的查询中直接使用这个函数:
注意:CLR集成需要较高的数据库权限,SELECT TOP(10) dbo.ReverseDns( CAST(SUBSTRING([nSrcIPAddress],1,1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress],2,1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress],3,1) AS INT) + '.' + CAST(SUBSTRING([nSrcIPAddress],4,1) AS INT) ) AS SourceDomain, dbo.ReverseDns( CAST(SUBSTRING([nDstIPAddress],1,1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress],2,1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress],3,1) AS INT) + '.' + CAST(SUBSTRING([nDstIPAddress],4,1) AS INT) ) AS DestinationDomain FROM 你的表名称EXTERNAL_ACCESS权限也有安全风险,所以只在必要时使用。
子方案2:用xp_cmdshell调用nslookup(强烈不推荐)
这种方法是通过调用系统命令nslookup来解析,但启用xp_cmdshell会带来极大的安全隐患,容易被攻击者利用执行恶意命令,性能也很差,所以只做个了解,绝对不建议在生产环境用:
-- 启用xp_cmdshell(非常危险!) sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE; -- 创建解析函数 CREATE FUNCTION dbo.ReverseDns_Cmd(@ip NVARCHAR(15)) RETURNS NVARCHAR(255) AS BEGIN DECLARE @result NVARCHAR(255), @cmd NVARCHAR(100) SET @cmd = 'nslookup ' + @ip + ' 2>&1' CREATE TABLE #tempOutput (line NVARCHAR(255)) INSERT INTO #tempOutput EXEC xp_cmdshell @cmd SELECT @result = line FROM #tempOutput WHERE line LIKE '%name =%' IF @result IS NOT NULL SET @result = LTRIM(RTRIM(SUBSTRING(@result, CHARINDEX('=', @result)+1, 255))) ELSE SET @result = @ip DROP TABLE #tempOutput RETURN @result END
内容的提问来源于stack exchange,提问作者Dwayne Dibbley
相关产品推荐
相关产品推荐

