0

任何人都知道如何列出每个 IP 和相关进程,例如 cmd 中的“netstat -a -n -b”或“netstat -o”来获取 pid

我已经搜索和搜索并找到了可以做到这一点的 API,但不幸的是它是用 c++ 记录的,我需要它在 VB6 或 VB.NET 中

GetTcpTable2 http://msdn.microsoft.com/en-us/library/bb408406(v=vs.85).aspx

GetOwnerModuleFromTcpEntry http://msdn.microsoft.com/en-us/library/aa366003(v=vs.85).aspx

如果无法在 vb 代码中获取进程句柄或 ID,请告诉我谢谢

4

1 回答 1

0

谷歌搜索似乎没有找到关于这些 API 的太多信息,但我能够在 allapi.mentalis.org 上找到这篇文章,该文章讨论GetTcpTable了 IP Helper API ( iphlpapi.dll) 中的函数以及 VB6 的一些示例代码。该GetOwnerModuleFromTcpEntry函数也是同一个API的一部分,所以它的实现应该是比较相似的,虽然我找不到任何例子。

命名空间似乎提供了当前使用的System.Net.NetworkInformation所有 IP 端点,但我似乎找不到任何东西可以让您使用该命名空间中的这些端点获取有关实际进程的任何信息。您可能会尝试的是System.Diagnostics名称空间。在那里,您可以访问Process具有您想要获取的大部分信息的对象,包括 PID 和名称(尽管您可能必须解决某些进程名称的权限问题)。我使用以下内容进行了快速测试,并将其与netstat -a -n -b -o我通过管道传输到文本文件的结果进行了比较,这似乎是一个不错的匹配。在任何人说什么之前,这糟糕的代码,我只是把它放在一起进行测试,所以请不要起火;)。

Dim CurrentProcesses As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcesses

For Each Proc As System.Diagnostics.Process In CurrentProcesses
    Try
        Debug.WriteLine("[" & Proc.Id.ToString & "] " & Proc.MainModule.ToString)
    Catch ex As Exception
        'An "Access Denied" exception may be thrown on the Proc.MainModule.ToString, but
        'you can still get the PID for the process.
        Debug.WriteLine("[" & Proc.Id.ToString & "] Cannot get module name")
    End Try
Next Proc

我能想到的最后一个选择是从代码中实际调用命令行(使用Shellor Process.Start)并运行netstat并将其通过管道传输到文本文件,或者将其读入内存。从那里,您可以解析结果。这方面的一个例子是(取自Experts-Exchange 上的一个问题):

Dim process As New Process()
Dim output As String = String.Empty

process.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
process.StartInfo.FileName = "netstat"
process.StartInfo.Arguments = "-a -n -b -o"
process.StartInfo.CreateNoWindow = True
process.StartInfo.ErrorDialog = False
process.StartInfo.RedirectStandardOutput = True
process.StartInfo.UseShellExecute = False
process.Start()
process.WaitForExit(5000)

output = process.StandardOutput.ReadToEnd()
MessageBox.Show(output)

显然,此方法需要更多代码来解析output字符串,但它会为您提供从netstat命令接收到的确切信息。

于 2013-07-23T14:40:21.507 回答