14

我已經創建了一個自定義安裝程序包來在客戶端計算機上安裝一些字體,並將其部署到C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\FontsInstaller下的先決條件文件夾中。一切都很好,引用它作爲Visual Studio 2010的先決條件,我能夠發佈應用程序沒有問題。ClickOnce先決條件:錯誤:發佈的安裝程序可能已損壞

,另一方面客戶端哈希驗證過程中得到一個錯誤:

Verifying file hash

Error: Setup has detected that the file 'C:\Users\RMORAN~1\AppData\Local\Temp\VSD4684.tmp\FontsInstaller\fontsinstaller.msi' has either changed since it was initially published or may be corrupt.

我試過,包括散列,並與引導程序清單生成排除它,我總是在客戶端上相同的結果。只要散列驗證失敗,該文件就會立即刪除(出於安全原因)。

現在,我發現一個Microsoft Connect bug report說:

"I have a custom bootstrapper package installed as a prerequisite for my application. When I build this on a system that has Visual Studio 2012 installed, the installation fails with the following error:

Setup has detected that the file '...' has either changed since it was initially published or may be corrupt.

I am building in Visual Studio 2010, with no changes to the package or projects. When Visual Studio 2012 is not installed, this works as expected."

我試過,沒有安裝VS2012另一個工作站上建立這個安裝程序,並把它傳遞客戶端上的哈希驗證(我遇到了一個問題,簽署,但那是一個不同的故事)。對於具有VS2012的生成機器而言,這確實是一個問題,而不是客戶機,因爲構建在我的原始工作站上的程序包在沒有VS2012的機器上也會出現故障。

是否有其他人遇到過這個問題,如果是的話,您是否發現了一個解決方法,除了沒有安裝VS2012?

+0

同樣的問題!安裝vs2012後,我的自定義引導程序包不想用clickonce安裝。你解決了嗎? – giammin

回答

11

我使用了一個反射工具來查看引導程序代MSBuild任務(在安裝了.NET 4.5的計算機上),並發現它增加了product.xml文件的<PackageFile />元素。具體來說,它試圖從每個文件計算一個公鑰。如果它能找到一個,它將該鍵與PublicKey屬性的值進行比較。如果這些值不同,它會發出警告,但在兩種情況下,它都會保持剛剛計算的值。

如果它不能確定一個公開密鑰,它隨後計算該文件的一個散列SHA256和執行與Hash屬性的值類似的比較,如果它們是不同的發光警告和設置Hash的值屬性與計算值。

您可以通過從得到的setup.exe中提取SETUPCFG資源來確認這些發現;它是product.xml文件合併的文本版本。

無論如何,請記住我如何說它計算出文件的SHA256散列,如果它找不到公鑰? <PackageFiles> Element (Bootstrapper)的文檔說Hash屬性的值應該是SHA1散列

我無法驗證結果setup.exe用於驗證Hash屬性(它是非託管代碼,我無法找到它的符號)的SHA1或SHA256中的哪一個,但讓記錄顯示類似的引導程序生成器MSBuild任務的.NET 4.0版本顯示它確實使用SHA1算法來計算Hash屬性的值,因此通過扣除我們可以說setup.bin(至少是Windows SDK v7中的一個)。 0A)正在使用SHA1。我很確定我嘗試使用Windows SDK v8.0A中的setup.bin,並得到相同(錯誤)的結果。 (可以通過將setup.bin從v8.0A SDK複製到.NET 4來確認。0只機,看是否產生的setup.exe可以使用基於散列的驗證安裝定製的引導程序包)

所以,如果基於散列的驗證是在設置引導程序壞了,我們至少可以使用公鑰(基於證書)驗證。好消息是引導程序生成器會自動開始使用這種機制,如果它能夠從軟件包文件中提取證書的公鑰。壞消息是,這意味着每個包文件必須以signtool.exe簽署和有效的代碼簽名證書(不是每個人都可能有一個代碼簽名證書躺在身邊,但如果你正在做點擊一次你可能.. )。

一旦我簽署了我們的自定義引導程序使用的程序包文件,當我使用安裝了.NET 4.5的計算機構建項目時,我停止了在運行時的安裝失敗,但仍然在生成有效的引導程序時沒有安裝.NET 4.5的機器。

TL;博士:登錄您的包文件用代碼簽名證書,避免引入.NET 4.5的缺陷。

+0

我使用與用於簽署單擊應用程序的相同證書籤署了包文件'(.msi)'。它已成功簽署。然後爲它創建一個引導程序清單。我仍然得到錯誤'文件XYZ.msi更改,因爲它最初發表或可corrupt'在日誌中我看到的只是後'驗證文件hash'發生錯誤。在安裝'VS2012'時,我安裝'.net 4'之前,應用程序引導工作正常。有任何想法嗎? – PUG

+0

好了,所以我沒有上安裝所有的Windows更新我的'贏得7'機具有相同簽名的包顯明,並改爲'的的WinVerifyTrust返回錯誤-2146762487 文件不被信任 錯誤:安裝程序檢測到文件的發佈<我的自定義軟件包>無法驗證.'此錯誤只出現在我的證書上,我沒有安裝我在軟件包上簽名的證書。但我無法繞過在200臺機器上安裝此證書 – PUG

+0

是的,它證實它只適用於我在'Memory Management Console'上手動添加證書的系統 – PUG

1

你需要從改變GenerateBootstrapper Path

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper

1

您需要更改GenerateBootstrapper從路徑:

C:\ Program Files文件(86) \ Microsoft SDKs \ Windows \ v7.0A \ Bootstrapper

C:\ Program Files文件(x86)的\微軟的SDK \的Windows \ v8.1A \引導程序

和複製MSI包(要使用) 從C:\ Program Files文件( x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bootstrapper 到C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ Bootstrapper

相關問題