C# 将DNS查询映射到进程id

C# 将DNS查询映射到进程id,c#,windows,sockets,dns,udp,C#,Windows,Sockets,Dns,Udp,我希望将DNS查询从Windows系统映射到进程ID。 到目前为止,我只找到了一个解决方案,但它是“苦乐参半” 我有一个本地DNS服务器,它拦截DNS查询并将它们转发到真正的服务器。这意味着我在127.0.0.1:53上收听UDP和TCP(主要是UDP)。 当我得到一个DNS查询时,我有客户端的端口,并用netstat跟踪它,因此我可以看到进行该查询的进程ID 这里的问题是,我只得到Chrome.exe和svchost.exe的pid。 这是因为Chrome可能有自己的DNS解析器,所有其他应用

我希望将DNS查询从Windows系统映射到进程ID。 到目前为止,我只找到了一个解决方案,但它是“苦乐参半”

我有一个本地DNS服务器,它拦截DNS查询并将它们转发到真正的服务器。这意味着我在127.0.0.1:53上收听UDP和TCP(主要是UDP)。 当我得到一个DNS查询时,我有客户端的端口,并用netstat跟踪它,因此我可以看到进行该查询的进程ID

这里的问题是,我只得到Chrome.exe和svchost.exe的pid。 这是因为Chrome可能有自己的DNS解析器,所有其他应用程序都使用默认的Windows解析器,该解析器可能位于svchost.exe中。 如果我创建一个简单的控制台应用程序,并向“Stack Overflow.com”发出HTTP请求,我将从svchost.exe获得一个DNS请求。 我需要获取“consoleapplication1.exe”的pid

我尝试使用netstat查看进程连接到的IP,然后将它们与DNS查询的解析答案关联起来,但这对我不起作用。 为什么?因为我正在使用此本地DNS服务器阻止某些查询。例如,如果我想阻止“abc.com”,该进程将永远不会连接到“abc.com”的IP,因为我正在从DNS服务器阻止它


我只需要找到我正在阻止的进程。

如果DNS客户端服务停止,行为可能会改变。或者您可以钩住各种API调用。或者可以使用自定义名称空间提供程序替换DNS的内置名称空间提供程序,请参阅。什么Windows版本?自Windows 8.1以来,DNS客户端具有用于客户端查找的ETW事件(必须显式启用日志)。您正在查找事件ID 3006,其中包括调用者的PID(事件/系统/执行进程ID)。在以前的版本中,您唯一的办法是完全停止DNS客户端(禁用缓存),然后检查您的服务器。@Jeroenmoster评论。但logparser无法搜索事件id 3006的pid字段。你还知道什么吗?看看答案