0

cmdの「netstat -a -n -b」やpidを取得する「netstat -o」のように、IPと関連するプロセスをそれぞれにリストする方法を誰もが知っています

私は検索して検索し、それを実行できる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 に関しては、Google 検索ではあまり出てこないようですが、allapi.mentalis.orgGetTcpTableで、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

私が思いつく最後の代替手段は、実際にコードからコマンド ラインを呼び出し (Shellまたはを使用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 に答える