2010-08-13 170 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

相關問題