代码之家  ›  专栏  ›  技术社区  ›  Mark Stahler

通过注册表检测已安装的程序

  •  58
  • Mark Stahler  · 技术社区  · 17 年前

    我需要开发一个过程来检测用户的计算机是否安装了某些程序,如果安装了,是什么版本。我相信我需要一个包含注册表位置和注册表项的列表来查找并将其提供给程序,这不是问题。有更好的方法来完成这一点吗?

    我的第一个想法是在卸载条目中检入注册表,但我想检测的应用程序似乎没有。所有使用应用程序进行输入的注册表的标准位置是什么?

    9 回复  |  直到 7 年前
        1
  •  34
  •   Piskvor left the building Rohit Kumar    15 年前

    用户特定设置应写入hkcu\software,机器特定设置写入hklm\software。在这些键下,结构 [software vendor name]\[application name] (例如) HKLM\Software\Microsoft\Internet Explorer )可能是最常见的,但那只是惯例,而不是自然法则。

    很多(大多数?)应用程序还将其卸载项添加到 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name] 但同样的,并不是所有的应用程序都这样做。

    这些是最重要的项;但是,注册表的内容不必准确地表示安装的软件-可能应用程序安装了一次,但随后被手动删除,或者卸载程序没有删除所有跟踪。如果您想确定,请检查文件系统,看看应用程序是否仍然存在于其注册表项所说的位置。

    编辑:

    如果您是组管理员的成员,可以检查 HKEY_USERS Hive-每个用户的hkcu实际上都在那里(你需要知道用户的sid,或者浏览所有的sid)。

    注意:正如@brian ensink所说,“installed”是一个模糊的概念——我们是否试图找到用户可以运行的内容?有些软件甚至根本不写入注册表:搜索“便携式应用”,查看专门修改为直接从媒体(CD/USB)运行的应用,以及 在计算机上留下任何痕迹。我们可能还需要扫描磁盘、网络磁盘以及用户下载的任何内容,以及互联网上可访问的Windows共享内容(是的,这些内容是合法存在的)- \\live.sysinternals.com\tools 我想到了)。在这个方向上,用户可以运行的内容没有真正的限制,除非受到系统策略的阻止。

        2
  •  36
  •   Peter Brittain    10 年前

    在64位系统上,x64密钥是:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    

    大多数程序都列在那里。看看钥匙: DisplayName DisplayVersion

    请注意,最后一个并不总是设置的!

    在64位系统上,x86密钥(通常包含更多条目)是:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
    
        3
  •  9
  •   Scott Stanchfield    17 年前

    可以使用msi api枚举Windows Installer安装的所有内容,但这不会列出计算机上所有可用的软件。在不了解您需要什么的情况下,我认为“已安装”的概念有点模糊。有很多方法可以将软件部署到系统中,从大型复杂的安装程序到zip文件,以及两者之间的一切。

        4
  •  6
  •   MSalters    17 年前

    应用程序不需要任何注册表项。实际上,许多应用程序根本不需要安装。U3 U盘就是一个很好的例子;上面的程序只是从文件系统运行的。

    如前所述,大多数好的应用程序都可以通过它们的uninstall注册表项找到。这实际上是一对密钥,每个用户和每台机器(hkcu/hklm-piskvor只提到了hklm-one)。不过,它并不(总是)提供安装目录。

    如果在香港大学,那么你必须意识到 HKEY_CURRENT_USER 真正的意思是“当前用户”。其他用户有自己的hkcu条目和自己安装的软件。你找不到。阅读 每一个 HKEY_USERS 在具有漫游配置文件的企业网络上,Hive是一个灾难。你真的不想从你遥远的[美国中国欧洲]办公室取1000个账户。

    即使安装了应用程序,并且您知道在哪里,它也可能没有您所拥有的相同的“版本”概念。最好的来源是可执行文件中的“版本”资源。这确实是一个复数形式,所以你必须找到所有的版本,从所有版本中提取版本资源,并且在冲突发生时决定一些合理的东西。

    所以-祝你好运。失败的方法有很多种。

        5
  •  2
  •   Arivan Bastos    8 年前

    您可以使用PowerShell脚本查看寄存器并获取安装的程序详细信息。下面的脚本将生成一个包含已安装程序完整列表的文件。用扩展名“.ps”保存并双击该文件。

    #
    # Generates a full list of installed programs.
    #
    
    # Temporary auxiliar file.
    $tmpFile = "tmp.txt"
    
    # File that will hold the programs list.
    $fileName = "programas-instalados.txt"
    
    # Columns separator.
    $separator = ","
    
    # Delete previous files.
    Remove-Item $tmpFile
    Remove-Item $fileName
    
    # Creates the temporary file.
    Create-Item $tmpFile
    
    # Searchs register for programs - part 1
    $loc = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
    $names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
    foreach ($name in $names)
    {
        IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
            $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
            Write-Host $line
            Add-Content $tmpFile "$line`n"        
        }
    }
    
    # Searchs register for programs - part 2
    $loc = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
    $names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
    foreach ($name in $names)
    {
        IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
            $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
            Write-Host $line
            Add-Content $tmpFile "$line`n"
        }
    }
    
    # Sorts the result, removes duplicate lines and
    # generates the final file.
    gc $tmpFile | sort | get-unique > $filename
    
        6
  •  1
  •   David Airapetyan    14 年前

    除了上面提到的所有注册表项外,您还可能需要查看hkey_current_user\software\microsoft\installer\products中仅为当前用户安装的程序。

        7
  •  0
  •   Nick    17 年前

    似乎寻找特定于已安装程序的功能会更好,但是hkcu\software和hklm\software是要寻找的地方。

        8
  •  0
  •   Naikrovek    16 年前

    win32_产品从不显示所有内容,只显示通过msi安装程序安装的软件(据我所知)。

    有很多软件包是通过其他安装程序安装的,但没有出现在那里。需要另一种方法。

        9
  •  0
  •   user10211111    7 年前

    hkey_current_user\software\microsoft\windows nt\currentversion\appcompatflags\compatibility assistant\persisted