2010-08-13 43 views
8

我已经安装了一些带有GUID的MSI(0733556C-37E8-4123-A801-D3E6C5151617)。 在注册表中注册的程序: HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\()如何查找注册表中的程序位置,如果我知道MSI GUID?

价值 UninstallString = MSIEXEC.EXE/I(0733556C-37E8-4123-A801-D3E6C5151617)

我的问题是:在删除程序时,MsiExec.exe实用程序如何知道要运行的文件的名称和路径?在注册表中可以找到这些信息?

+0

已经有非常好的答案了,但**最简单的方法**获取有关已安装产品的信息可能是[**使用简单的PowerShell命令**](https://stackoverflow.com/questions/29937568/how -can-i-find-the-product-guid-an-installed-msi-setup/29937569#29937569) – 2017-08-20 18:02:34

+0

再读一遍我想我误解了你的问题。我想你的问题的实际答案是,有关已安装产品的所有信息都存储在注册表下的HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer中。这是** Windows安装程序数据库**,您不能直接在此触摸任何值。您可以通过[Win32 API调用(C++)](https://msdn.microsoft.com/en-us/library/windows/desktop/aa369426(v = vs.85).aspx)访问它们,也可以使用[COM automation](https://msdn.microsoft.com/en-us/library/windows/desktop/aa367810(v = vs.85).aspx)(更简单)。 – 2017-10-07 22:06:40

回答

12

Windows将Windows Installer配置信息隐藏并加密到注册表中。它不像注册表的其他部分那样用人眼来浏览。

要查询/修改/删除此信息,您需要使用MSI功能。
Installer Function Reference

对于您的特定问题,请尝试功能MsiGetProductInfo

+2

隐藏和加密 - 真的吗? – Rup 2010-08-13 17:44:02

+1

请参阅[Windows安装程序团队博客](http://blogs.msdn.com/b/windows_installer_team/archive/2006/05/12/595950.aspx)中的[Windows安装程序之道,第2部分] //blogs.msdn.com/b/windows_installer_team/)。请参阅规则21:避免使用您不具备的配置数据。它说:“这些数据由安装程序管理,不鼓励用户或应用程序直接访问;实际上,某些数据经过编码使得手动操作非常困难。” – 2013-11-04 14:50:48

0

该键映射到HKEY_CLASSES_ROOT\Installer\Products\

+0

HKEY_CLASSES_ROOT \ Installer \ Products \不包含已安装程序的路径。我在哪里找到它? – Yuriy 2010-08-13 13:06:27

+1

它不需要已安装的应用程序的路径,如果安装了10个应用程序,它会如何?它只需要卸载程序(或.msi模块)的路径。 在命令行查看“wmic产品列表”的输出。 – 2010-08-13 13:34:02

+0

其实我需要确定应用程序位置(磁盘驱动器),以便在安装msp修补程序之前估计可用磁盘空间。如果我只知道HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {\ n}中的guid,我可以确定安装的应用程序的位置吗? – Yuriy 2010-08-13 14:25:11

7

你可以试试,在命令行:

wmic product where "Name like '%your software here%'" get Name, Version, PackageCode 
+3

太酷了!但我的cmq表示这是一个无效的查询... – BlackBear 2011-05-09 18:13:15

1

有来自TARMA软件的研究,我发现这个有用的免费的实用工具。从their website得到它。

7

下面是一个简单的c#程序,它使用MsiGetProductInfo,正如William Leara所说,可以获取磁盘上缓存安装程序的实际位置。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Int32 len = 512; 
     System.Text.StringBuilder builder = new System.Text.StringBuilder(len); 
     MsiGetProductInfo("{89C098E5-C108-49F9-9B1D-10503C6D8A05}", "LocalPackage", builder, ref len); 
     Console.WriteLine(builder.ToString()); 
     Console.ReadLine(); 
    } 

    [DllImport("msi.dll", CharSet = CharSet.Unicode)] 
    static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); 
} 
1

您不需要任何软件。这是在Windows 10中工作,我认为它也适用于Windows 7。

如果您的产品号是0733556C-37E8-4123-A801-D3E6C5151617。 尝试找到密钥C65533708E7332148A103D6E5C516171(基本上是颠倒的),找到它后,浏览InstallProperties子项,如果不存在,请尝试查找其他结果。一旦找到InstallProperties,打开并找到LocalPackage Key。然后,当你安装你的应用程序时,MSI将保存为缓存的MSI包的路径。

1

此问题的前提是误导性的,因为执行卸载时未使用注册表中的UninstallString。继续并更改字符串以测试它 - 它不会使用您更改的字符串。

尽管引用注册表中的东西可能很吸引人,但最简单的答案是注册表中的Windows Installer数据是实现细节。问题基本上是询问MsiConfigureProduct(.... INSTALLSTATE_ABSENT ...)如何工作,猜测实现细节以及它在注册表中的位置是毫无意义的。它的API一路下滑。这可能是海报可能想要完成的实际任务,但它被卸载的工作方式所掩盖。

+0

绝对同意 - 直接访问MSI数据库详细信息是不可接受的,甚至只是试图解码许多人似乎正在使用他们在注册表中找到的东西。 – 2017-10-10 21:25:08

相关问题