( TLDR; 有很多帖子涉及远程进程,但我需要根据特定的路径/环境名称获取一组非常具体的进程,但我没有任何ID都很方便。)
我被要求创建一个小应用程序,显示在特定服务器上的特定环境中从特定服务运行的所有进程。用户将选择他们想要重新启动的服务,应用程序将在后台重新启动它并进行必要的清理。 服务的结构如下:
服务器 - >环境 - >服务 - >过程(ES)
服务的流程具有如下层次结构:
wrapper.exe - > java.exe - > tss.exe
重新启动给定服务时,有时会遗留tss.exe,导致启动过程失败。我的应用程序需要能够找到并终止这些孤立的进程。 我对这些进程的唯一信息是名称和完整的文件路径,如下所示:
\\服务器\ T $ \帐户\ environmentName \ bnk.run \ t24bin \ eb_interface
我没有任何进程ID,并且通常在一台服务器上运行多个tss.exe和wrapper.exe。我希望只能找到与相关服务相关的人。我能想到解决这个问题的唯一方法是在文件路径中使用环境名称,获取父wrapper.exe进程的ID,并从那里获取子进程。
到目前为止我遇到了多个问题......
Process类不允许我终止远程进程,我也无法使用该路径来确定哪个tss.exe属于哪个服务。 使用WMI Win32_Process类给了我一堆错误:
“功能评估已禁用,因为之前的功能评估已超时。您必须继续执行以重新启用功能评估。“
通过调试,我发现它在所有System.TypeInitializationException
属性上抛出ManagementPath
(内部抛出System.Threading.ThreadAbortException
)。
并且进程ManagementObject
为类路径,属性和限定符提供了相同的错误。
我运行的测试方法获取所有进程并在Windows窗体的文本框中显示其名称:
ManagementScope scope = new ManagementScope(@"\\serverName\root\cimv2");
var query = new SelectQuery("select * from Win32_Process where name = 'tss.exe'");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
foreach (ManagementObject process in searcher.Get())
{
processDisplay.Text += " " + process.GetPropertyValue("Name");
}
}
代码确实为整个服务器正确显示进程名称,但我仍然遇到上述错误,并且不明白它是否正常工作,或者当我试图获取更多信息时它是否会导致我出现问题来自我的过程对象。
我的问题是:
为什么我会收到这些错误?如果它们已修复,我可以使用WMI流程管理执行我想要做的事情吗?
如果没有,我还能采取其他什么方式?