如何查找正在运行的进程的已安装软件名称和版本

时间:2016-07-20 04:30:51

标签: c# process registry

我根据此代码

派生了当前正在运行的进程列表
static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
    uint pid;
    GetWindowThreadProcessId(hwnd, out pid);
    foreach (Process p in Process.GetProcesses())
    {
        if (p.Id == pid)
            new TrayLog().Log(
                System.Security.Principal.WindowsIdentity.GetCurrent().Name + "^" + p.Id + "^" + p.ProcessName + "^" + System.DateTime.Now.ToString("yyyyMMddHHmmss")
            );
    }
}

根据以下代码派生当前安装的软件列表     RegistryKey键;

// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
    RegistryKey subkey = key.OpenSubKey(keyName);
    try
    {
        if (!subkey.GetValue("DisplayName").Equals(null))
        {
            DataRow rows = dts.NewRow();
            rows["Machine_UUID"] = Machine_UUID;
            rows["Display_Name"] = subkey.GetValue("DisplayName").ToString();
            rows["Display_Version"] = subkey.GetValue("DisplayVersion").ToString();
            rows["Internal_Version"] = subkey.GetValue("Version").ToString();
            rows["Installation_Date"] = DateTime.ParseExact(subkey.GetValue("InstallDate").ToString(), "yyyyMMdd", null);
            rows["strInstallation_Date"] = ((DateTime)rows["Installation_Date"]).ToString("yyyyMMdd");
            rows["Installation_Location"] = subkey.GetValue("InstallLocation").ToString();
            rows["Installation_Source"] = subkey.GetValue("InstallSource").ToString();
            rows["Uninstall_String"] = subkey.GetValue("UninstallString").ToString();
            rows["Estimated_Size"] = subkey.GetValue("EstimatedSize").ToString();
            dts.Rows.Add(rows);
        }
    }
    catch (Exception e) { }
}

我需要匹配这两个列表,这样我需要获取软件名称和正在运行的进程的其他详细信息......

1 个答案:

答案 0 :(得分:0)

您可以获取Process.MainModule.FileName,然后使用FileVersionInfo.FileDescription获取显示名称。

然后使用此密钥,它是所有当前安装的程序的列表及其卸载信息。

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

现在从键中获取显示名称,并将它们与流程显示名称进行比较。