理想情况下,我想在C#中执行此操作,因此我将包含C#标记。
我有几个使用System.ServiceModel.ServiceHost
运行并打开TCP端口(每个一个)的Window Communication Foundation服务。我有一个正在使用的端口号列表,但我想使用正在运行的服务从端口号映射到可执行文件。
我曾尝试使用netstat,TCPView和其他一些类似的工具,我发现尝试搜索此解决方案,但没有任何显示我的过程,我能得到的最接近的是系统(PID 4)。
所有这些都是Windows WCF服务,按预期运行,并且显示在netstat和TCPView(按端口号),但只能提供“系统”作为进程。
代码由几个不同的部门管理,因此我不会将通用接口方法视为有效的解决方案。我对该机器拥有完全的管理员权限。
答案 0 :(得分:1)
WCF提供了一个WMI interface for diagnostics,您可以使用它来将WCF服务端口与特定进程相关联。特别是Service课看起来很有希望。
(请随意在此处附上您的示例代码,或将其作为另一个答案发布。)
答案 1 :(得分: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>