我读了很多获取计划的信息。 没有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媒体库获取目录列表
在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条目,定义如下:
WindowsInstaller REG_DWORD存在(并且不为零)
对于这样的条目,您可以采取从msi.dll使用Win32函数MsiGetProductInfoW的附加步骤,并要求由该键表示的GUID的“VersionString”属性。
如果此函数返回1605:ERROR_UNKNowN_PRODUCT ,则表示该条目未按照Windows Installer安装,应从显示中排除。
执行这个小调整后,我的列表现在与程序和功能相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。