如何识别运行进程

How to identify running process

一般问题:如何从同一服务器上的 Web 应用程序 运行 识别进程?假设我们从不同的控制台应用程序启动此过程,但我们可以将有关此过程的任何数据保存到数据库中,该数据库可由 Web 应用程序访问。

我的具体设置,以及更详细的问题描述:

我试过的解决方案:
我试过将计算器进程的 StartTime 保存到数据库中。然后在 Dashboard 中,我尝试按名称检查所有 运行 计算器进程,从 System.Diagnostics.Process class 获取它们的 StartTime。我的想法是查看哪些未完成的进程与 运行 的进程具有相同的 StartTime。那就是我能够区分 运行 个和死的。但我得到:

Win32Exception: Access is denied
    System.Diagnostics.ProcessManager.OpenProcess(int processId, int access, bool throwIfExited)
    System.Diagnostics.Process.GetProcessHandle(int access, bool throwIfExited)
    System.Diagnostics.Process.GetProcessTimes()
    System.Diagnostics.Process.get_StartTime()

好的,最后我通过使用不同的访问过程数据的方式修复了它。

using System.Management;

我使用 System.Management 从计算器进程中读取 CreationDate。

public IEnumerable<string> GetTimestampIdOfRunningProcesses(string processName)
{
    var managementClass = new ManagementClass("Win32_Process");
    foreach (var process in managementClass.GetInstances())
    {
        var name = process["Name"].ToString();
        if (name.StartsWith(processName))
        {
            var startTimeText = process["CreationDate"].ToString();
            var startTime = ManagementDateTimeConverter.ToDateTime(startTimeText);
            yield return startTime.ToTimestampId();
        }
    }
}

其他详细信息:

当我开始这个过程时,我得到了 StartTime。

public DateTime StartProcess(string path)
{
    using (var process = new SystemProcess())
    {
        process.StartInfo = CreateProcessStartInfo(path);
        process.Start();
        return process.StartTime;
    }
}

然后我将它转换为统一格式的字符串(使用扩展方法)。

public static string ToTimestampId(this DateTime dateTime)
{
    return dateTime.ToString("yyyy.MM.dd HH:mm:ss.ffffff");
}

这是我统一 System.Management 读取的数据(精度有限)和我在流程开始时获得的非常精确的 StartTime 的方法。这样我就可以比较两个值。