2013-07-08 53 views
0

我的安裝項目需要檢測已安裝的程序作爲先決條件或選擇退出某些組件。 msi函數MsiGetProductInfo()MsiEnumRelatedProducts()函數公開所需的功能。Microsoft程序的產品/升級代碼

但不幸的是,我無法找到所需要的微軟軟件產品和升級代碼來檢查任何地方。有誰知道在哪裏查找它們?由於大多數軟件包和/或串行代碼的不可用性,所以安裝這些產品以確定代碼的測試不是一種選擇。

我可能會嘗試下載每個包,並與逆戟鯨研究它,但由於我們的小互聯網連接,這將需要數天甚至數週,所以我更喜歡一個更簡單的方法。

目前,最重要的要求的數據是Microsoft Office 2010家庭和版本的代碼。但在未來,這肯定是我需要檢查的其他產品。

預先感謝您的幫助, 漢納斯

回答

2

Office產品有各種不同的SKU有不同的產品代碼和屬性的UpgradeCode。爲此,我不使用它們。而是查看物理註冊表項和DLL以指示安裝所需的功能(實際依賴項)。

+0

聽起來很合理。我想我會嘗試堅持使用常見的註冊表項。謝謝。 – Hannes

1

要理解你的問題並不那麼容易。如果您希望能夠構建檢測必需的INSTALLPROPERTY_INSTALLEDPRODUCTNAME的設置,則必須至少安裝一臺安裝了所有先決條件的計算機 - 而不是?

爲了得到所有安裝ProductCodes的列表,你可以使用MsiEnumProducts()或MsiEnumProductsEx()。

你只是給了一些正確的API函數。哪裏是「找到所需產品的問題/升級的代碼是什麼呢? 您預期的產品是不在列表中,或者你還沒有嘗試生成)已安裝程序的列表?MsiGetProductInfo(的一個返回屬性會給你INSTALLPROPERTY_INSTALLEDPRODUCTNAME例如信息這是不夠的,你

而是在自己的節目?有是獲取已安裝程序的這樣一個清單,他們的代碼,例如,從這裏的工具msiinv.exe可供選擇: https://skydrive.live.com/?cid=27e6a35d1a492af7&id=27E6A35D1A492AF7%21910&authkey=!ANs8Pr0aVhaT_qQ 用法例如:c:\ msiinv \ msiinv.exe -p> c:\ msiinv \ msiinv_output.txt 在此處查看Aaron Stebners博客以獲得更多(例如,當下載鏈接已過時): http://blogs.msdn.com/b/astebner/archive/2005/07/01/434814.aspx

你也可以用一些腳本來做到這一點。

首先,使用ProductCodes承認外國的包是不是一個好主意,因爲那個包的一個簡單的更新會改變的代碼。升級代碼更好,但是..

但是,如果您想識別Office或SQL Server等更大的產品,它可以是PITA以真正識別所有正確的軟件包,而不是可選的軟件包來處理特定於語言的軟件包,處理32或64位軟件包。 即使您是專家,我也不建議依靠MSI代碼來處理複雜的情況。這很容易失敗。 嘗試在版本之間持續存在的HKLM \ Software \ Microsoft下找到註冊表項,甚至可以告訴版本,例如HKLM \ Software \ Microsoft \ Microsoft SQL Server下用於搜索此產品的一個鍵,與Office類似。

隨意問,如果還有剩餘的東西。

+0

你的觀點和克里斯托弗一樣。鑑於針對Office 2010家族的各種不同的UpgradeCodes,檢查通用註冊表項聽起來更有希望。 – Hannes

+0

爲了完整起見,問題不在於獲取已安裝產品的UpgradeCodes,而是獲取我的機器從未見過的產品的UpgradeCodes。列出所有Microsoft產品的所有UpgradeCodes的表。但是,在寫這些文章的同時,這個想法會變得越來越天真...... – Hannes

+0

是的。坦率地說,我重讀了有關Office的最後一句話,否則我不會回答:-)但也許是一個補充:我對產品的三步識別非常滿意,並不總是需要所有三個:1.註冊表值,最好兩個,一個包含路徑,一個包含產品版本,2.查看/ a主文件的路徑。 3.至少讀取文件的文件版本,如果你得出與產品版本有很強關係的結論。然後,您可以編寫一個將搜索級別作爲輸入的函數。 – Philm