2

理想情况下,我想在 C# 中执行此操作,因此我包含 C# 标记。

我有几个 Window Communication Foundation 服务正在运行并使用System.ServiceModel.ServiceHost. 我有一个正在使用的端口号列表,但我想使用正在运行的服务从端口号映射到可执行文件。

我曾尝试使用 netstat、TCPView 和其他一些我发现尝试搜索此解决方案但没有显示我的进程的类似工具,我能得到的最接近的是系统 (PID 4)。

所有这些都是 Windows WCF 服务,按预期运行,并且确实显示在 netstat 和 TCPView 中(按端口号),但只能提供“系统”作为进程。

代码由几个不同的部门管理,所以我不认为通用接口方法是有效的解决方案。我确实拥有这台机器的完全管理员权限。

4

2 回答 2

1

WCF 提供了一个用于诊断的 WMI 接口,您应该能够使用该接口将 WCF 服务端口与特定进程相关联。特别是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);
}

还需要将此添加到每个服务 .config,而不是 WMI 客户端

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