如何在Windows上使用Qt获取开放端口的进程名称和二进制路径?

4
我正在编写一个端口冲突检查函数。 我需要确定:
  • 是否打开了某个特定的端口
  • 守护进程的进程名称
  • 守护进程的二进制文件路径
我的想法是运行一个QProcess来执行本地命令netstat -abno并解析输出。但参数-b需要提升权限(UAC),我不想让用户受到UAC提示的困扰。
是否有任何Qt库提供这样的功能? 你会如何实现这个功能?

端口路径是什么意思?坦白地说,看到标题时,我一直在想串口,而没有看到正文... - László Papp
“端口路径”?我的意思是特定端口监听的守护程序可执行文件的路径。我相应更改了问题。为什么呢?因为我需要这个路径来检查守护进程/可执行文件是否是从我们的安装文件夹运行,还是从其他目录运行。 - Jens A. Koch
在Windows上很容易实现。但是如果没有提升权限,这将是非常容易被利用的信息。 - Hans Passant
@Jens:你有没有找到“二进制路径”这一部分的解决方案? 我现在的了解是,没有权限时无法确定进程的二进制文件,但也许你找到了什么吗? - Martin Ba
不行。访问这些信息需要提升权限。最终我添加了一个应用程序启动检查和一个关闭对话框,要求监控工具的用户以管理员身份重新启动或通过更改可执行文件设置来授予提升的权限,以避免出现问题。 - Jens A. Koch
显示剩余2条评论
2个回答

2

您可以使用TCPView中的Tcpvcon.exe

TCPView需要管理员权限,而tcpvcon则不需要

使用-an-acn参数

您甚至可以指定要检查的应用程序: 例如Tcpvcon.exe -an Skype

最初是由Dane在一段时间前发现的:

如果您想要一个GUI界面,可以使用TCPView。这是微软收购的旧Sysinternals应用程序


1
  • 我的想法是运行一个QProcess执行本地命令netstat -abno并解析输出

要做到这一点,你只需要:

QProcess cmdProcess;
...
cmdProccess.start(..);
while(cmdProcess.waitForReadyRead(-1)) someParseFunction(cmdProcess.readAllStandardOutput());

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