在Windows中使用C#做软件开发,有时候需要获取当前系统中已安装的软件及其版本号,接下来就简单介绍一下,如何通过C#获取来实现。
1、通过注册表
public List<PcSoftinfo> GetAllInstalledSoftware(string name)
{var keys = new RegistryKey[]{Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Installer\Products"),Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Installer\Products"),Registry.ClassesRoot.OpenSubKey(@"Installer\Products"),Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"),Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"),Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"),Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall")};var softs = new List<PcSoftinfo>();foreach (var k in keys){if (k == null)continue;foreach (var keyName in k.GetSubKeyNames()){RegistryKey subkey = k.OpenSubKey(keyName);var displayName = subkey.GetValue("DisplayName") as string;//var productName = subkey.GetValue("ProductName") as string;不同注册表名称不一样。if (!string.IsNullOrEmpty(displayName)){int systemComponent = (int)subkey.GetValue("SystemComponent", 0);if (systemComponent == 1){//系统应用排除//continue;}var displayVersion = subkey.GetValue("DisplayVersion") as string;if (!string.IsNullOrEmpty(displayVersion)){softs.Add(new PcSoftinfo() { Name = displayName, Ver = displayVersion });}}}}return softs;
}
优点快,缺点不完全,有些软件读不到。
2、通过Win32_Product
public List<PcSoftinfo> IsSoftwareInstalled(string softwareName){// 创建WMI查询,检查Win32_Product类中的安装信息//string query = "SELECT Name, Version FROM Win32_Product WHERE Vendor ='厂家名称'";string query = "SELECT Name, Version FROM Win32_Product";ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);var softs = new List<PcSoftinfo>();foreach (ManagementObject obj in searcher.Get()){// 如果找到匹配的软件string NAME = obj["Name"].ToString();string version = obj["Version"]?.ToString();softs.Add(new PcSoftinfo() { Name = NAME, Ver = version });}return softs; // 没找到软件}
优点全,缺点慢。