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

时间:2012-10-15 19:14:51

标签: c# windows-services port

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

3 个答案:

答案 0 :(得分:3)

请检查this question on stackoverlow。它与您要求的不完全相同,但它指向一个名为GetExtendedTcpTable available through PInvoke的有用函数,它可以满足您的需要。另请查看this one

答案 1 :(得分:1)

经过大量的环顾四周,我发现那里没有文件记录" OwningModuleInfo"在MIB_TCPROW_OWNER_MODULE结构中。

然后寻找我发现此评论:

Weird issue regarding GetOwnerModuleFromTcpEntry when targeting x64

"我得出结论,数组中的第一项是运行服务列表中服务的索引,..."

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

其他有用的链接:

Marshalling Struct with Array of Struct Member

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

答案 2 :(得分:0)

类似问题的答案总是建议使用Iphlpapi,但是你不清楚如何在这个netstat -ban复制粘贴中获得RpcSs(服务名称):   TCP 0.0.0.0:135 0.0.0.0:0 LISTENING   RPCSS  [svchost.exe的]

或此处的时间表:

TCP [::]:49154 [::]:0 LISTENING   时间表  [svchost.exe的]

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

然而,理想情况下,人们不希望使用C#的轮询式方法。使用ETW更合适。我认为缺少从C#中使用它的例子是因为开始使用它有一些开销,周围的例子可能特定于其他类型的跟踪/监控场景。

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