我想在C#中获取窗口服务及其端口的列表。我可以使用ServiceController
获取所有窗口服务,但我无法获得这些服务的端口。
答案 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输出并不是很清楚。