Фильтровать установленные приложения из реестра, чтобы показать список только из программ и функций

Я легко могу получить список приложений в системе из расположения реестра HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall, но список приложений, которые я получаю, намного больше, чем список, показанный в программах и Характеристики.

Например, в тестовой системе, которую я настроил, в "Программы и компоненты" отображается 14 записей, но когда я извлекаю приложения из раздела реестра, показанного выше, я получаю 35 приложений назад.

Есть ли способ отфильтровать этот список до 14 записей, представленных в разделе "Программы и компоненты"?

Вот мой код на случай, если это поможет:

Class InstalledApps
    Dim _AppList As New ArrayList

    Sub New()
        GetKeyValues("SOFTWARE\Microsoft\Windows\Currentversion\Uninstall", RegistryHive.LocalMachine)
        GetKeyValues("SOFTWARE\Microsoft\Windows\Currentversion\Uninstall", RegistryHive.CurrentUser)
        If CheckOSfor64() Then GetKeyValues("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\", RegistryHive.LocalMachine)
        _AppList.Sort()
    End Sub

    Sub New(SaveFileLocation As String)
        GetKeyValues("SOFTWARE\Microsoft\Windows\Currentversion\Uninstall", RegistryHive.LocalMachine)
        GetKeyValues("SOFTWARE\Microsoft\Windows\Currentversion\Uninstall", RegistryHive.CurrentUser)
        If CheckOSfor64() Then GetKeyValues("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\", RegistryHive.LocalMachine)
        _AppList.Sort()
        SaveFile(SaveFileLocation)
    End Sub

    Public ReadOnly Property getAppList As ArrayList
        Get
            Return _AppList
        End Get
    End Property

    Private Sub SaveFile(Path As String)
        Try
            IO.File.Delete(Path)

            Using newFile As StreamWriter = New StreamWriter(Path)
                newFile.AutoFlush = True
                For Each item As String In _AppList
                    If item.Contains("(KB") Then Continue For
                    newFile.WriteLine(item)
                Next
            End Using

        Catch ex As Exception

        End Try
    End Sub

    Private Function CheckOSfor64() As Boolean
        Try
            If System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") = "AMD64" Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Return False
        End Try
    End Function

    Private Sub GetKeyValues(ByVal RegKey As String, ByVal Hive As Microsoft.Win32.RegistryHive)
        Dim rk As RegistryKey = Nothing 'Main Keys
        Dim sk As RegistryKey = Nothing 'Sub Keys
        Dim name As String = String.Empty

        Try
            Select Case Hive
                Case RegistryHive.CurrentUser
                    rk = Registry.CurrentUser.OpenSubKey(RegKey)
                Case RegistryHive.LocalMachine
                    rk = Registry.LocalMachine.OpenSubKey(RegKey)
            End Select

            If rk Is Nothing Then Exit Sub

            For Each skn As String In rk.GetSubKeyNames
                If skn = Nothing Then Continue For
                sk = rk.OpenSubKey(skn)

                If sk.ValueCount = 0 Then Continue For

                name = GetSubKeyValue(sk, "DisplayName")

                'If empty skip
                If name = String.Empty Then Continue For

                'Check for Duplicate before adding
                If Not _AppList.Contains(name) Then _AppList.Add(name)

            Next
        Catch ex As Exception
            errorLogs.Add(ex)
        Finally
            If Not rk Is Nothing Then rk.Close()
            If Not sk Is Nothing Then sk.Close()
            rk = Nothing
            sk = Nothing
        End Try

    End Sub

    Private Function GetSubKeyValue(ByVal MainKey As RegistryKey, ByVal ValueName As String) As String
        Try
            If Not MainKey Is Nothing Then
                Dim t As String = MainKey.GetValue(ValueName)
                If t = Nothing Then Return String.Empty Else Return Trim(t)
            Else
                Return String.Empty
            End If
        Catch ex As Exception
            Return String.Empty
        End Try
    End Function
End Class

0 ответов

Другие вопросы по тегам