如何查找正在运行的进程的已安装软件名称和版本
本文关键字:安装 进程 软件 版本 运行 何查找 查找 | 更新日期: 2023-09-27 17:57:50
我已经基于此代码导出了当前运行进程的列表
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) { }
}
我需要匹配这两个列表,这样我需要获得软件名称和运行过程的其他详细信息。。。
您可以获取Process.MainModule.FileName
,然后使用FileVersionInfo.FileDescription
来获取显示名称。
然后使用此密钥,它是当前安装的所有程序及其卸载信息的列表。
HKEY_LOCAL_MACHINE'SOFTWARE'WOW6432Node'Microsoft'Windows'CurrentVersion'Uninstall
现在从键中获取显示名称,并将它们与进程显示名称进行比较。