C#でウィンドウサービスとそのポートのリストを取得したい。を使用してすべてのウィンドウサービスをServiceController
取得できますが、これらのサービスのポートを取得できません。
3 に答える
stackoverlowでこの質問を確認してください。これは、あなたが求めているものとまったく同じではありませんが、 PInvokeを通じて利用できるGetExtendedTcpTableと呼ばれる便利な関数を指しており、必要なことを実行できます。こちらもチェックしてください。
よく調べてみると、MIB_TCPROW_OWNER_MODULE構造に文書化されていない「OwningModuleInfo」があることがわかりました。
それからそれを探して私はこのコメントを見つけました:
x64をターゲットとする場合のGetOwnerModuleFromTcpEntryに関する奇妙な問題
「配列の最初の項目は、実行中のサービスのリストにあるサービスのインデックスであるという結論に達しました...」
したがって、質問への答えは、netstat -bが示す名前情報(サービス名とアドレス+ポート)を取得するためにそれを使用し、目的のサービスをフィルタリングすることです。このhttps://github.com/Loriowar/IpHlpApidotnetlibには、この機能を除いて、関連するコードが既に設定されていることがわかりました。
その他の便利なリンク:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366911(v=vs.85).aspx
同様の質問への回答は常にIphlpapiの使用を提案していますが、このnetstat -banコピーペーストでRpcS(サービス名)を取得する方法はまったく明確ではありません。TCP0.0.0.0:135 0.0.0.0:0 LISTENINGRpcSs[svchost。 EXE]
またはここのスケジュール:
TCP [::]:49154 [::]:0リスニングスケジュール[svchost.exe]
私はこれに対する解決策を探しましたが、何も見つかりませんでした(-簡単)。Netstatは、Iphlpapiのドキュメント化されていない関数を呼び出しますが、Iphlpapiからサービス名を取得するのか、Iphlpapiからpidを使用し、他の何かを使用してサービス名を取得するのかは明確ではありません。私はこれに答えるためにデバッガーで時間を費やしたくはありません。
ただし、理想的には、C#のポーリングスタイルのアプローチを使用したくないでしょう。ETWを使用する方が適切です。C#からそれを使用する例がないのは、それを使い始めるのにいくらかのオーバーヘッドがあり、周りの例は他のタイプのトレース/監視シナリオに固有である可能性があるためだと思います。
概要:これを実装する時間が足りない場合は、netstatの出力を保存するだけが「解決策」のようです。理想的には、簡単に使用できるC#の例を見つけて、ネットワーク接続を監視し、ファイアウォールの変更の可能性とともに、どのサービスまたはプロセスがそれらを処理/開始したかを把握したいと思います。私はETWで両方を行うことが可能であると信じていますが、私の現在のニーズでは、それを機能させるために必要な未知の時間を正当化するのは難しいです。「logmanqueryproviders」にプロバイダーがリストされていることを少なくとも理解しました。次に、プロバイダーを有効にするために何かを行う必要があります(パケットキャプチャなどの場合のトレースのドライバーサポート)。ETWを使用するためのC#プロジェクトがあります。しかし、ETWを使用してnetstat出力を再現するのにどれだけの労力がかかるかはまったく明らかではありません。