获取注册表中所有应用程序的路径

问题描述 投票:0回答:2
string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
        using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registryKey))
        {
            (from a in key.GetSubKeyNames()
             let r = key.OpenSubKey(a)
             select new
             {
                 Application = r.GetValue("DisplayName")
             }).ToList().FindAll(c => c.Application != null).ForEach(c => Debug.WriteLine(c.Application));

此代码段显示注册表中应用程序的所有名称。我需要执行应用程序的 exe 文件的路径,并且我需要知道如何使用 Process.Start(); 运行它们

registry executable execute
2个回答
1
投票

Windows 中并没有真正明确的来源。 最接近的方法是枚举开始菜单。 查看这篇文章了解如何做到这一点: 以编程方式访问所有用户开始菜单

基本上,您需要调用 SHGetSpecialFolderPath API 来检索开始菜单的位置,然后枚举该路径中的所有快捷方式。

这个 stackoverflow 问题讨论了如何从快捷方式中提取图标;您可以使用相同的方法来提取启动应用程序所需的工作路径和可执行文件: 从 Windows .lnk(快捷方式)文件中提取图标


0
投票

如果您尝试获取所有已安装的应用程序(您的标题是唯一的问题,并且显然您询问了注册表),您还可以考虑从 WMI 服务查询 Win32_product 类,脚本示例记录在: https://learn.microsoft.com/en-us/previous-versions/tn-archive/ee156540(v=technet.10)

上面的注册表文件夹和 WMI 服务都有此警告:

WMI Win32_Product 类使您能够枚举计算机上安装的软件(前提是该软件是使用 Windows Installer 安装的)

如果 URL 发生变化,我将把以下文档中的整个脚本放在下面:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("c:\scripts\software.tsv", True)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSoftware = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_Product")
objTextFile.WriteLine "Caption" & vbtab & _
"Description" & vbtab & "Identifying Number" & vbtab & _
"Install Date" & vbtab & "Install Location" & vbtab & _
"Install State" & vbtab & "Name" & vbtab & _
"Package Cache" & vbtab & "SKU Number" & vbtab & "Vendor" & vbtab _
 & "Version"
For Each objSoftware in colSoftware
 objTextFile.WriteLine objSoftware.Caption & vbtab & _
 objSoftware.Description & vbtab & _
 objSoftware.IdentifyingNumber & vbtab & _
 objSoftware.InstallLocation & vbtab & _
 objSoftware.InstallState & vbtab & _
 objSoftware.Name & vbtab & _
 objSoftware.PackageCache & vbtab & _
 objSoftware.SKUNumber & vbtab & _
 objSoftware.Vendor & vbtab & _
 objSoftware.Version
Next
objTextFile.Close

您还会发现 PowerShell 有一些更好的方法从 wmi 获取数据:

get-wmiobject Win32_Product |
 Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

但是,我再次发现所有这些方法只提供了已安装内容的一小部分,或者 Windows 设置/控制面板中“添加或删除程序”显示的内容。我进一步想知道如何建立一个更完整的列表。尽管您表示您只想要该注册表项下的内容,但这完全反映在上面。

© www.soinside.com 2019 - 2024. All rights reserved.