微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#:如何得到像控制面板程序和function一样安装程序?

我读了很多获取计划的信息。 没有algorithm做我想要的。 我需要像控制面板中一样安装程序。

所以我用:

WMI Win32_Product类。 它只显示msi安装的程序。

registry项。 HKLMSOFTWAREMicrosoftwindowsCurrentVersionUninstall 。 同样,一些程序不显示在控制面板中,一些程序显示在控制面板中而不是在这个registry节点中。

那么,这个世界上有没有人知道哪个algorithm使用控制面板来显示已安装的程序?

UPD1:是的,我使用64位,我知道有64位安装程序的另一个节点“HKLM SOFTWARE Wow6432Node 微软的Windows CurrentVersion 卸载”,但下面的代码枚举的HKLM SOFTWARE Wow6432Node 微软 CurrentVersion Uninstall部分,奇怪…

sql Server Compact Edition数据库部署策略

无法通过C#连接到ManagementScope。 拒绝访问

使用C ++检查客户端上的可用.NET框架

ManagedThreadID和操作系统ThreadID之间的关系

无法在计算机上打开服务控制pipe理器

var programs = new List();

string registry_key = @“SOFTWARE Microsoft Windows CurrentVersion Uninstall”;

使用(Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))

{

foreach(key.GetSubKeyNames()中的stringsubkey_name)

{

使用(RegistryKey subkey = key.OpenSubKey(subkey_name))

{

var name =(string)subkey.GetValue(“displayName”);

如果(!string.IsNullOrEmpty(名称))

{

programs.Add(名称);

}

}

}

}

registry_key = @"SOFTWAREWow6432NodeMicrosoftwindowsCurrentVersionUninstall"; using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) { foreach (string subkey_name in key.GetSubKeyNames()) { using (RegistryKey subkey = key.OpenSubKey(subkey_name)) { var name = (string)subkey.GetValue("displayName"); if (!string.IsNullOrEmpty(name)) { programs.Add(name); } } } } foreach (var program in programs.OrderBy(x => x)) { Console.WriteLine(program); }

如何获得服务器上打开的HTTP连接的总数?

为Windows服务设置环境variables

从Windows媒体库获取目录列表

突出显示标签Windows窗体

在ASP.NET中下载文件(通过服务器),同时将其传输给用户

好的gyus,我写了类,可以从注册表中安装程序没有修补程序和更新。 它仍然不完全像控制面板,但几乎 。 我希望这可以帮助其他人。

公共静态类InstalledPrograms

{

const string registry_key = @“SOFTWARE Microsoft Windows CurrentVersion Uninstall”;

public static List<string> GetInstalledPrograms() { var result = new List<string>(); result.AddRange(GetInstalledProgramsFromregistry(RegistryView.Registry32)); result.AddRange(GetInstalledProgramsFromregistry(RegistryView.Registry64)); return result; } private static IEnumerable<string> GetInstalledProgramsFromregistry(RegistryView registryView) { var result = new List<string>(); using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,registryView).OpenSubKey(registry_key)) { foreach (string subkey_name in key.GetSubKeyNames()) { using (RegistryKey subkey = key.OpenSubKey(subkey_name)) { if(IsProgramVisible(subkey)) { result.Add((string)subkey.GetValue("displayName")); } } } } return result; } private static bool IsProgramVisible(RegistryKey subkey) { var name = (string)subkey.GetValue("displayName"); var releaseType = (string)subkey.GetValue("ReleaseType"); //var unistallString = (string)subkey.GetValue("UninstallString"); var systemComponent = subkey.GetValue("SystemComponent"); var parentName = (string)subkey.GetValue("ParentdisplayName"); return !string.IsNullOrEmpty(name) && string.IsNullOrEmpty(releaseType) && string.IsNullOrEmpty(parentName) && (systemComponent == null); } }

我拿了MelnikovI编写的代码(这是超级有用的),并添加了一些东西。 首先,它在注册表中搜索四个地方:

HKLM SOFTWARE 微软的Windows CurrentVersion 卸载

HKLM SOFTWARE Wow6432Node 微软的Windows CurrentVersion 卸载

HKCU SOFTWARE 微软的Windows CurrentVersion 卸载

HKCU SOFTWARE Wow6432Node 微软的Windows CurrentVersion 卸载

它还检查是否有任何子键 – 如果没有,则跳过该键。

最后,它做了一个正则表达式,只允许一组字符[^ a-zA-Z0-9。()+ – ]。

我只是从C#开始,所以我不知道如何循环遍历所有四个注册点,所以我有两个循环(一个用于HKLM,一个用于HKCU)。

public static class InstalledPrograms { public static List<string> GetInstalledPrograms() { var result = new List<string>(); result.AddRange(GetInstalledProgramsFromregistry(RegistryView.Registry32)); result.AddRange(GetInstalledProgramsFromregistry(RegistryView.Registry64)); result.sort(); return result; } private static string cleanText(string dirtyText) { Regex rgx = new Regex("[^a-zA-Z0-9 .()+-]"); string result = rgx.Replace(dirtyText,""); return result; } private static IEnumerable<string> GetInstalledProgramsFromregistry(RegistryView registryView) { var result = new List<string>(); List<string> uninstall = new List<string>(); uninstall.Add(@"SOFTWAREMicrosoftwindowsCurrentVersionUninstall"); uninstall.Add(@"SOFTWAREWow6432NodeMicrosoftwindowsCurrentVersionUninstall"); foreach (string registry_key in uninstall) { using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,registryView).OpenSubKey(registry_key)) { foreach (string subkey_name in key.GetSubKeyNames()) { using (RegistryKey subkey = key.OpenSubKey(subkey_name)) { if (IsProgramVisible(subkey)) { result.Add(cleanText(subkey.GetValue("displayName").ToString()).ToString()); } } } } using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser,registryView).OpenSubKey(registry_key)) { if (key != null) { foreach (string subkey_name in key.GetSubKeyNames()) { using (RegistryKey subkey = key.OpenSubKey(subkey_name)) { if (IsProgramVisible(subkey)) { result.Add(cleanText(subkey.GetValue("displayName").ToString()).ToString()); } } } } } } return result; }

如果有人感兴趣,我将结果与我一直使用的PowerShell进行比较,它们是相同的。

##Get list of Add/Remove programs if (!([Diagnostics.Process]::GetCurrentProcess().Path -match '\syswow64\')) { $uninstallPath = "SOFTWAREMicrosoftwindowsCurrentVersionUninstall" $uninstallWow6432Path = "SOFTWAREWow6432NodeMicrosoftwindowsCurrentVersionUninstall" @( if (Test-Path "HKLM:$uninstallWow6432Path" ) { Get-ChildItem "HKLM:$uninstallWow6432Path"} if (Test-Path "HKLM:$uninstallPath" ) { Get-ChildItem "HKLM:$uninstallPath" } if (Test-Path "HKCU:$uninstallWow6432Path") { Get-ChildItem "HKCU:$uninstallWow6432Path"} if (Test-Path "HKCU:$uninstallPath" ) { Get-ChildItem "HKCU:$uninstallPath" } ) | ForEach-Object { Get-ItemProperty $_.PSPath } | Where-Object { $_.displayName -and !$_.SystemComponent -and !$_.ReleaseType -and !$_.ParentKeyName -and ($_.UninstallString -or $_.noremove) } | sort-object displayName | Select-Object displayName } else { "You are running 32-bit Powershell on 64-bit system. Please run 64-bit Powershell instead." | Write-Host -ForegroundColor Red }

MelnikovI的答案对于大多数目的已经足够了 – 我的清单中有144个项目,程序和功能中有143个项目。 审查 ,他的解决方案是打这些注册表位置:

HKLM SOFTWARE 微软的Windows CurrentVersion 卸载

HKCU 软件微软的Windows CurrentVersion 卸载

HKLM SOFTWARE Wow6432Node 微软的Windows CurrentVersion 卸载

为了有资格,每个子项必须有:

displayName REG_SZ值

并不得有:

SystemComponent REG_DWORD(非零)

ParentKeyName或ParentdisplayName REG_SZ值

ReleaseType REG_SZ值

我发现的一个附加增强功能是Windows Installer条目,定义如下:

密钥名称一个标准的GUID字符串

WindowsInstaller REG_DWORD存在(并且不为零)

对于这样的条目,您可以采取从msi.dll使用Win32函数MsiGetProductInfoW的附加步骤,并要求由该键表示的GUID的“VersionString”属性

如果此函数返回1605:ERROR_UNKNowN_PRODUCT ,则表示该条目未按照Windows Installer安装,应从显示中排除。

执行这个小调整后,我的列表现在与程序和功能相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐