これらの 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
ます。