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

时间:2009-03-10 13:56:38

标签: performance winapi networking

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

基本上,我希望,对于每个进程,要知道它在一段时间内读取/写入网络的字节数。如果我能知道IP地址/端口号等,那就太棒了。

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

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

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

5 个答案:

答案 0 :(得分:3)

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

  1. 各种论坛都有很多帖子要求提供相同的信息。
  2. 我看到的唯一可能的程序化解决方案是使用Windows事件跟踪(ETW)。这需要一本小书来解释/理解。
  3. 可以从注册表中获取的PERF计数器不是Powershell友好的。它们使用旨在由C / C ++程序使用的数据结构。一个非常完整的示例的网址: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
  9. 因此...

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

    或者...

    你可以自虐并使用ETW。

    或者...

    你可以离开深层并将Linux的proc文件系统(正如你所说,从脚本中使用起来要容易得多)移植到Windows: - )

答案 1 :(得分:1)

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

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

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

修改: 我注意到它说的是“Programatically”(它昨天说过吗?)

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

这种方法的一个非常好的方法是,如果你有合适的权限,它甚至可以远程工作。

答案 2 :(得分:1)

您需要使用IPHelper API。

这是一篇很好的文章,详细介绍了它在.NET中的使用: http://www.codeproject.com/KB/IP/iphlpapi.aspx

享受。

答案 3 :(得分:1)

我为此写了一个解决方案。

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

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

答案 4 :(得分:0)

将ETW与EVENT_TRACE_FLAG_NETWORK_TCPIP一起使用将完成此工作。