Ik zit met een hardnekkig probleem waar ik graag de Tweakers community op los wil laten (als een soort laatste strohalm
). Wees niet afgeschrikt.
Het zit als volgt: ik wil graag alle 'executable' (.exe) file paths achterhalen van alle geïnstalleerde programma's in Windows (de volledige filepath van de installatie locatie van een programma zoals bijvoorbeeld:
C:\Program Files (x86)\CCleaner Browser\Update\CCleanerBrowserUpdate.exe).
Ik gebruik hiervoor C#.
Dit dacht ik met C# op de volgende manier te kunnen uitlezen uit het Windows registry:
Ik dacht dat de oplossing zou kunnen zijn om eerst op de volgende manier alle .exe files op te halen uit de program files folder...:
Maar dit pakt niet helemaal uit zoals ik dacht. De "displayname" uit het Windows registry is niet gelijk aan de de fileInfoVersion.productname property.
Nu zoek ik eigenlijk naar een manier om toch op deze manier een dergelijke koppeling te maken. Ik zag bijvoorbeeld dat de main executable vrijwel altijd het grootste .exe bestand is in een folder en dus zou je de .exe bestanden in een folder kunnen sorteren op 'size in MB' om zo de grootste eruit te kunnen pikken. Dit blijkt echter niet altijd een betrouwbare manier.
Nu is mijn concrete vraag eigenlijk of iemand weet op welke wijze je nou alle applicatie .exe file paths vind van al je geïnstalleerde programma's zoals weergegeven in het windows registry.
Heeft een main-executable van een geïnstalleerd programma misschien een bepaalde property die zo'n bestand uniek maakt t.o.v. andere .exe files in een folder?
Misschien 'productversion' of 'fileversion'?
Wat ik trouwens ook geprobeerd heb is om het via de ManagementObjectSearcher te doen:
Weet iemand een oplossing? Ik heb al een hoop gezocht online maar ik vind geen sluitende oplossing voor dit probleem.
...
Het zit als volgt: ik wil graag alle 'executable' (.exe) file paths achterhalen van alle geïnstalleerde programma's in Windows (de volledige filepath van de installatie locatie van een programma zoals bijvoorbeeld:
C:\Program Files (x86)\CCleaner Browser\Update\CCleanerBrowserUpdate.exe).
Ik gebruik hiervoor C#.
Dit dacht ik met C# op de volgende manier te kunnen uitlezen uit het Windows registry:
Echter het probleem is in dit geval dat niet elk programma een install location value krijgt toegewezen.code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public static List<string> registryUserPrograms2() { List<string> installedProgramNames = new List<string>(); string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) { foreach (string subkey_name in key.GetSubKeyNames()) { using (RegistryKey subkey = key.OpenSubKey(subkey_name)) { if (subkey.GetValue("InstallLocation") != null && subkey.GetValue("InstallLocation").ToString() != "") { string name = subkey.GetValue("InstallLocation").ToString(); installedProgramNames.Add(name.ToLower()); } } } } return installedProgramNames; }
Ik dacht dat de oplossing zou kunnen zijn om eerst op de volgende manier alle .exe files op te halen uit de program files folder...:
.. en om dan vervolgens op de volgende manier door deze .exe files heen te 'loopen' om fileInfo objecten op te halen en uit te lezen:code:
1 2 3 4 string[] allexesx86 = Directory.GetFiles(programFilesX86, "*.EXE", SearchOption.AllDirectories); string[] allexesPro = Directory.GetFiles(programFiles, "*.EXE", SearchOption.AllDirectories); string[] allexes = allexesx86.Concat(allexesPro).ToArray();
Ik dacht vervolgens op deze manier de connectie te kunnen maken tussen de 'DisplayName" property in het windows registry en de fileInfoVersion productname property om zo alsnog via een omweg de .exe file paths te kunnen krijgen van alle geïnstalleerde programma's (m.b.v.: 'FileInfo.Fullname').code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 int index = 0; foreach (var file in allexes) { FileInfo info = new FileInfo(file); FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(info.FullName); ExeInfo exeInfo = new ExeInfo(); exeInfo.size = info.Length; exeInfo.fullName = info.FullName; exeInfo.developer = [b]myFileVersionInfo.CompanyName[/b]; exeInfo.productName = myFileVersionInfo.ProductName; exeInfo.directoryPath = info.DirectoryName; exeInfo.parentFolderName = System.IO.Path.GetFileName(System.IO.Path.GetDirectoryName(exeInfo.fullName)); exeInfo.fileDescription = myFileVersionInfo.FileDescription; exeInfo.iconicon = ""; if (!exedirectories.Contains(info.DirectoryName)) { exedirectories.Add(info.DirectoryName); } if (info.Length > 0) { exeInfo.iconicon = ExtractIconImagefromExe(info.FullName, index); } exeinfos.Add(exeInfo); }
Maar dit pakt niet helemaal uit zoals ik dacht. De "displayname" uit het Windows registry is niet gelijk aan de de fileInfoVersion.productname property.
Nu zoek ik eigenlijk naar een manier om toch op deze manier een dergelijke koppeling te maken. Ik zag bijvoorbeeld dat de main executable vrijwel altijd het grootste .exe bestand is in een folder en dus zou je de .exe bestanden in een folder kunnen sorteren op 'size in MB' om zo de grootste eruit te kunnen pikken. Dit blijkt echter niet altijd een betrouwbare manier.
Nu is mijn concrete vraag eigenlijk of iemand weet op welke wijze je nou alle applicatie .exe file paths vind van al je geïnstalleerde programma's zoals weergegeven in het windows registry.
Heeft een main-executable van een geïnstalleerd programma misschien een bepaalde property die zo'n bestand uniek maakt t.o.v. andere .exe files in een folder?
Misschien 'productversion' of 'fileversion'?
Wat ik trouwens ook geprobeerd heb is om het via de ManagementObjectSearcher te doen:
Echter dit levert ook niet het gewenste resultaat op. Dan ontbreken er ook een hoop applicatie executable file paths.code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public static List<string> getProgramsMOS() { List<string> mosPrograms = new List<string>(); ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); foreach (ManagementObject mo in mos.Get()) { //Console.WriteLine(mo["Name"]); if (mo["Name"] != null) { mosPrograms.Add(mo["Name"].ToString().ToLower()); } if (mo["InstallLocation"] != null) { mosPrograms.Add(mo["InstallLocation"].ToString()); } } return mosPrograms; }
Weet iemand een oplossing? Ik heb al een hoop gezocht online maar ik vind geen sluitende oplossing voor dit probleem.
...