【问题标题】:C# WMI Process Differentiation?C# WMI 进程区分?
【发布时间】:2010-04-09 17:41:47
【问题描述】:

场景

我有一个使用 WMI 返回进程列表的方法。 如果我有 3 个进程正在运行(所有这些都是 C# 应用程序) - 它们都有相同的进程名称但不同的命令行参数,如果我想启动它们或终止它们,我该如何区分它们!?

想法

据我所知,我在物理上无法区分它们,至少必须使用 Handle 才能区分,但这并不能告诉我其中哪一个被终止了,因为其他人仍然会坐在那里名字…………

....真的很难过,非常感谢您的帮助!

【问题讨论】:

  • 在您第一次启动这些进程时,有什么方法可以获取进程 ID?
  • 为什么不使用Handle?无论如何,它是关键属性。
  • 结合这两个cmets:Handle属性进程ID
  • 您能否详细说明“如果我想启动它们”是什么意思?你的意思是像“我想启动第四个同名的进程,我以后如何识别那个特定的实例来终止它?”?

标签: c# wmi


【解决方案1】:

使用将进程 ID 作为输出参数提供给您的技术来创建进程。例如

然后您可以使用该值来真正知道您以后要杀死哪个版本的进程。例如

  • WMI:获取匹配ProcessId的Win32_Process实例,调用Terminate()
  • .NET:使用 GetProcessById 获取流程实例,调用Kill,然后调用WaitForExit

(请注意,如果进程在您杀死它之前停止,操作系统可以将相同的进程 ID 分配给一个新进程,因此您当然需要仔细检查您是否正在杀死正确的进程,例如检查进程名)

【讨论】:

    【解决方案2】:

    WMI Win32_ProcessObject 有一个 CommandLine 属性,如果您知道这是区分实例的属性,您可以使用它。

    string query = “Select * From Win32_Process Where Name = “ + processName;
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    ManagementObjectCollection processList = searcher.Get();
    
    foreach (ManagementObject obj in processList)
    {
         string cmdLine = obj.GetPropertyValue("CommandLine").ToString();
    
         if (cmdLine == "target command line options")
         {
              // do work
         }
    }
    

    【讨论】:

    • 请注意,您需要SeDebugPrivilege 才能读取Win32_Process.CommandLine,因此通常无法远程读取此属性。
    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多