2

理想的には、これを C# 内で実行したいので、C# タグを含めます。

を使用して TCP ポート (それぞれ 1 つ) を実行し、開いている Window Communication Foundation サービスがいくつかありますSystem.ServiceModel.ServiceHost。使用しているポート番号のリストがありますが、実行中のサービスを使用して、ポート番号から実行可能ファイルにマップしたいと考えています。

netstat、TCPView、およびこのソリューションを検索しようとして見つけた他のいくつかの同様のツールを使用しようとしましたが、プロセスを表示するものはありません。取得できる最も近いのはシステム(PID 4)です。

これらはすべて Windows WCF サービスであり、意図したとおりに動作し、netstat および TCPView (ポート番号で) に表示されますが、プロセスとして「システム」のみを提供できます。

コードはいくつかの異なる部門によって管理されているため、共通のインターフェイス アプローチを有効なソリューションとは考えていません。私はマシンに対する完全な管理者権限を持っています。

4

2 に答える 2

1

WCFは、WCFサービスポートを特定のプロセスに関連付けるために使用できる診断用のWMIインターフェイスを提供します。特に、Serviceクラスは有望に見えます。

(説明されているように、ここにサンプルコードを添付するか、別の回答として投稿してください。)

于 2013-03-01T05:08:09.460 に答える
1

サンプルコードを @HarryJohnston の回答に追加します。

String wcfNamespace = String.Format(@"\\{0}\Root\ServiceModel", "MachineName");

ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(wcfNamespace, connection);
scope.Connect();

ObjectQuery query = new ObjectQuery("Select * From Service");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

ManagementObjectCollection queryCollection = searcher.Get();
ManagementObject[] listing = queryCollection.OfType<ManagementObject>().ToArray();

Dictionary<int, int> portToPID = new Dictionary<int, int>();

foreach (ManagementObject mo in queryCollection)
{
    //each of services only have one base address in my example
    Uri baseAddress = new Uri(((Array)mo.Properties["BaseAddresses"].Value).GetValue(0).ToString());
    int pid = Int32.Parse(mo.Properties["ProcessId"].Value.ToString());
    portToPID.Add(baseAddress.Port, pid);
}

また、WMI クライアントではなく、各サービスの .config にこれを追加する必要があります

<system.serviceModel>
    …
    <diagnostics wmiProviderEnabled="true" />
    …
</system.serviceModel>
于 2013-03-01T14:42:24.197 に答える