2016-07-20 10 views
0

ich die Liste der laufenden Verfahren auf diesem CodeWie die installierte Software Name und die Version für den Betrieb finden verarbeitet

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") 
      ); 
    } 
} 

Und die Liste der aktuell installierten Software auf Basis abgeleitet sind, werden auf den folgenden Code abgeleitet basierend RegistryKey-Schlüssel;

// 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) { } 
} 

Ich brauche diese beiden Liste übereinstimmen, so dass ich die Software Namen und andere Details des laufenden Prozesses bekommen ...

+0

Nicht alle laufenden Prozesse verfügen über entsprechende Deinstallationseinträge. –

Antwort

0

Sie konnten die Process.MainModule.FileName und dann FileVersionInfo.FileDescription verwenden die bekommen Anzeigename.

Verwenden Sie dann diesen Schlüssel, der eine Liste aller derzeit installierten Programme und deren Deinstallation ist.

Jetzt den Anzeigenamen von den Tasten abrufen und sie mit den Namen der Prozessanzeigen vergleichen.

+0

Vielen Dank shad0wk, das Process.MainModule ist, was ich erwartet habe, aber der von ProductName und ProductVersion abgerufene Wert stimmt nicht mit DisplayName und DisplayVersion von RegistryKey von "HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall" überein. ZB: Produktname: Microsoft® Visual Studio® 2012 - Produktversion: 11.0.50727.1! = DisplayName: Microsoft Visual Studio 2012 Devenv, DisplayVersion: 11.0.50727 –

+0

Vielleicht könnten Sie den Dateinamen abrufen, entfernen Sie die Erweiterung, und vergleichen Sie das mit dem Registrierungsschlüssel DisplayName ebenso gut wie. Es kann einige Übereinstimmungen bekommen. –