以编程方式获取Windows上的每个进程的网络统计信息?

问题描述 投票:12回答:5

我想知道哪些进程正在使用我的网络。这在Linux中很容易,但我对如何在Windows中执行此操作感到困惑。

从本质上讲,我希望每个进程能够知道它在一段时间内读取/写入网络的字节数。如果我能知道IP地址/端口号等,那将是非常棒的。

有什么指针吗? Windows Vista / Windows 2008似乎能够在资源监视器中执行此操作。他们是如何做到的呢?开销是多少?

我想在我自己的代码中执行此操作,因此实用程序(TCPView,PerfMon)对我没用。我还想拥有单独的磁盘和网络I / O计数器,因此默认的性能计数器是不够的。

Windows XP,2003,Vista,2008和7首选。 Win32或COM OK。

performance winapi networking
5个回答
1
投票

我写了一个解决方案。

用于收集统计数据的TDI过滤器驱动程序,这是一种与驱动程序通信并每秒获取一次统计数据的服务。由于过滤器位于TDI层,我知道哪些套接字属于哪些应用程序。该服务是这个数据的服务器,通过我写的API通过共享内存提供给任意第三方客户端。我写了一个GUI和一个命令行客户端。

您还可以在窗口中实时带宽形状发送(每个接口和/或应用程序和/或套接字)并通过套接字观察数据。


3
投票

经过深入研究后,我得出的是:

  1. 各种论坛都有很多帖子要求提供相同的信息。
  2. 我看到的唯一可能的编程解决方案是使用Windows事件跟踪(ETW)。这需要一本小书来解释/理解。
  3. 可以从注册表获得的PERF计数器不是Powershell友好的。它们使用旨在由C / C ++程序使用的数据结构。一个非常完整的例子的URL:http://msdn.microsoft.com/en-us/library/windows/desktop/aa372138(v=vs.85).aspx
  4. SysInternals有TCPVIEW,它按流程显示网络使用情况。当您启动它时,大多数进程都不会显示任何用法。它似乎只收集运行时间段的使用信息。这对于使用ETW的想法很重要。
  5. 如果我用IE9浏览网站,我会看到在TCPVIEW中创建进程。在大多数情况下,流程将在一分钟左右内消失(终止) - 以及流程的统计数据。
  6. 与ProcessExplorer类似,当创建进程时,它们会突出显示为绿色,当它们被销毁时会突出显示为红色。
  7. 红色突出显示的进程在下一次更新后消失。更新频率可以是1,2或5秒。但是有一个注册表设置,HKEY_CURRENT_USER \ Software \ Sysinternals \ TCPView \ Settings可以修改以设置其他刷新频率。如果是偏移量为0x98的DWORD,则以毫秒为单位。
  8. TCPVIEW有一个“保存”/“另存为”菜单项。输出是一个以空格分隔的文本文件,其中包含当前显示在GUI中的每个进程使用情况统计信息。以下是文件中的示例行。线路末尾的数字是接收到的pkts / sec,接收的字节数/秒,发送的pkts / sec和字节/秒,(不一定按顺序)iexplore.exe 864 TCP tin 61207 a96-17-203-64.deploy.akamaitechnologies.com http ESTABLISHED 2 12,928 8 9,420

所以...

一种可能的解决方案是使用TCPVIEW并通过脚本以编程方式生成的击键来控制它。您可以将刷新间隔设置为1,10,30等分钟,并让脚本发送按键以使TCPVIEW将输出保存在文件中。您可能希望脚本以刷新间隔的一半或三分之一发送击键,以确保获得的快照至少与刷新间隔的1/2或2/3一样长。您可以使用Import-CSV导入文件,并在脚本中轻松操作它。

要么...

你可以得到自虐并使用ETW。

要么...

您可以离开深度端口并将Linux proc文件系统(正如您所指出的,从脚本中使用起来要容易得多)到Windows :-)


1
投票

您需要使用IPHelper API。

这篇文章详细介绍了它在.NET中的用法:http://www.codeproject.com/KB/IP/iphlpapi.aspx

请享用。


1
投票

你会惊讶于你可以从Perfmon中获得的东西。

打开它,右键单击图形区域,然后选择“添加计数器...”。四处逛逛,看看有什么能满足您的需求。

从我对你所要求的内容的阅读中,我选择“进程”作为我的性能对象,并开始从进程列表中选择可能看起来的罪魁祸首,可能正在监视“IO数据字节/秒”计数器。如果你在那里乱搞,你可能会发现一些对你来说更有用的东西。

编辑:我注意到它“以编程方式”(昨天是否说过?)

好吧,你实际上可以获得Perfmon从注册表中获取密钥HKEY_PERFORMANCE_DATA的所有信息。我认为这就是Perfmon枚举和使用的东西,所以你应该能够使用perfmon来查看那里有什么并且适合你,然后编写代码在你自己的程序中实时读取它。

关于这种方法的一个非常好的事情是它甚至可以远程工作,如果你有正确的权限。


0
投票

使用带有EVENT_TRACE_FLAG_NETWORK_TCPIP的ETW可以完成这项工作。

© www.soinside.com 2019 - 2024. All rights reserved.