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

Rog*_*mbe 12 performance networking winapi

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

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

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

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

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

Χpẘ*_*Χpẘ 5

经过大量研究后,我得出以下结论:

  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 可以修改以设置其他刷新频率。If 是偏移量 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 :-)


小智 3

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

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

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

  • 我相信你的话,你看了这个问题并决定“编写自定义 TDI 筛选器驱动程序”是最好的解决方案。我认为如果您有一些可以发布的代码,您就会这样做,而且我不是那些说“向 m3 显示 c0deZ!”的人之一。为我指明正确的方向就足够了,谢谢。 (2认同)