如何获取Windows服务所开放的端口?

5
我希望能够在C#中获取窗口服务及其端口列表。使用 ServiceController 可以获取所有的窗口服务,但无法获取这些服务所使用的端口。
3个回答

3

1
在我进行了大量的搜索之后,我发现在MIB_TCPROW_OWNER_MODULE结构中存在未记录的"OwningModuleInfo"。
然后,我找到了这条评论: 有关针对x64目标使用GetOwnerModuleFromTcpEntry时的奇怪问题 “我得出的结论是数组中的第一项是正在运行的服务列表中服务的索引,...”
所以问题的答案就是使用它来获取 netstat -b 显示的名称信息(服务名称和地址+端口),并过滤您想要的服务。我发现这个 https://github.com/Loriowar/IpHlpApidotnet库已经设置好了相关代码,除了这个功能。
其他有用的链接: 带有结构体数组成员的编组结构体

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


0
类似问题的答案总是建议使用Iphlpapi,但不清楚如何在netstat -ban复制粘贴中获取RpcSs(服务名称): TCP 0.0.0.0:135 0.0.0.0:0 LISTENING RpcSs [svchost.exe]
或者在此处获取Schedule: TCP [::]:49154 [::]:0 LISTENING Schedule [svchost.exe]
我寻找了解决方法,但没有找到任何(易于)解决方案。Netstat调用一些未记录在Iphlpapi中的函数,但不清楚它是否从Iphlpapi获取服务名称,还是以某种方式使用Iphlpapi中的pid,并使用其他东西来获取服务名称。我不想花时间用调试器回答这个问题,因为...:
然而,理想情况下,人们不希望从C#中使用轮询式方法。更适合使用ETW。我认为缺乏使用它的示例是因为开始使用它需要一些开销,并且周围的示例可能特定于其他类型的跟踪/监视方案。
总结:如果您时间紧迫,只需保存netstat输出似乎是“解决方案”。理想情况下,我希望找到一个简单易用的C#示例来监视任何网络连接,并找出处理/启动它们的服务或进程以及可能的防火墙更改。我相信使用ETW可以同时完成这两个任务,但对于我目前的需求来说,很难证明需要花费多少时间才能使其正常工作。我至少已经发现,“logman query providers”列出了提供程序,然后您需要执行某些操作以启用提供程序(在某些情况下需要跟踪驱动程序支持,例如数据包捕获)。有一个使用ETW的C#项目。但是,要用ETW复制netstat输出需要付出多大的努力并不清楚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接