5

我想在 C# 中获取窗口服务及其端口的列表。我可以通过使用获得所有窗口服务,ServiceController但我无法获得这些服务的端口。

4

3 回答 3

3

Please check this question on stackoverlow. It is not exactly the same as you are asking, but it points to a useful function called GetExtendedTcpTable available through PInvoke, that can do what you need. Also check this one.

于 2012-10-15T19:34:10.103 回答
1

经过大量环顾后,我发现 MIB_TCPROW_OWNER_MODULE 结构中有未记录的“OwningModuleInfo”。

然后寻找我发现了这个评论:

针对 x64 时有关 GetOwnerModuleFromTcpEntry 的奇怪问题

“我已经得出结论,数组中的第一项是正在运行的服务列表中服务的索引,......”

因此,问题的答案将是使用它来获取 netstat -b 显示的名称信息(服务名称和地址+端口),过滤您想要的服务。我发现了这个https://github.com/Loriowar/IpHlpApidotnet lib,除了这个功能之外,它已经设置了一堆相关的代码。

其他有用的链接:

使用结构成员数组编组结构

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366911(v=vs.85).aspx

于 2015-03-13T07:47:42.947 回答
0

类似问题的答案总是建议使用 Iphlpapi,但完全不清楚如何在此 netstat -ban 复制粘贴中获取 RpcSs(服务名称):TCP 0.0.0.0:135 0.0.0.0:0 LISTENING RpcSs [svchost.可执行程序]

或这里的时间表:

TCP [::]:49154 [::]:0 监听计划 [svchost.exe]

我寻找解决方案并没有找到任何东西(-easy)。Netstat 在 Iphlpapi 中调用了一些未记录的函数,但不清楚它是从 Iphlpapi 获取服务名称,还是以某种方式使用 Iphlpapi 的 pid 并使用其他东西来获取服务名称。我真的不想花时间用调试器来回答这个问题,因为..:

然而,理想情况下,无论如何都不想使用 C# 中的轮询式方法。使用 ETW 会更合适。我认为缺乏从 C# 使用它的示例是因为开始使用它有一些开销,并且周围的示例可能特定于其他类型的跟踪/监视场景。

摘要:如果您没有时间来实现这一点,那么仅保存 netstat 输出似乎是“解决方案”。理想情况下,我希望找到一个简单易用的 C# 示例来监视任何网络连接,并找出哪些服务或进程处理/启动了它们以及可能的防火墙更改。我相信 ETW 可以同时做到这两点,但就我目前的需求而言,很难证明完成这项工作所需的未知时间是合理的。我至少发现“logman 查询提供程序”列出了提供程序,然后您需要做一些事情来启用提供程序(以及驱动程序支持在某些情况下进行跟踪,例如数据包捕获)。有一个使用 ETW 的 C# 项目。但完全不清楚使用 ETW 重现 netstat 输出需要付出多少努力。

于 2014-03-25T12:10:39.270 回答