14

クライアント マシンにいくつかのフォントをインストールするためのカスタム セットアップ パッケージを作成し、それを の下の前提条件フォルダーに展開しましたC:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\FontsInstaller。Visual Studio 2010 の前提条件として参照することですべて問題なく、問題なくアプリケーションを公開できます。

一方、クライアントはハッシュ検証中にエラーを受け取ります。

ファイル ハッシュの検証

エラー: セットアップは、ファイル 'C:\Users\RMORAN~1\AppData\Local\Temp\VSD4684.tmp\FontsInstaller\fontsinstaller.msi' が最初に公開されてから変更されたか、破損している可能性があることを検出しました。

Bootstrapper Manifest Generator でハッシュを含めて除外しようとしましたが、クライアントで常に同じ結果が得られます。ファイルは、ハッシュ検証に失敗するとすぐに (セキュリティ上の理由から) 削除されます。

さて、次のようなMicrosoft Connect バグ レポートを見つけました。

「アプリケーションの前提条件としてカスタム ブートストラップ パッケージをインストールしています。Visual Studio 2012 がインストールされているシステムでこれをビルドすると、次のエラーでインストールが失敗します。

セットアップは、ファイル '...' が最初に公開されてから変更されたか、破損している可能性があることを検出しました。

パッケージやプロジェクトに変更を加えずに、Visual Studio 2010 でビルドしています。Visual Studio 2012 がインストールされていない場合、これは期待どおりに機能します。」

VS2012 がインストールされていない別のワークステーションでこのインストーラーをビルドしようとしましたが、クライアントでハッシュ検証に合格しました (署名の問題に遭遇しましたが、それは別の話です)。元のワークステーションでビルドされたパッケージが VS2012 を搭載していないマシンでも失敗するため、クライアントではなく VS2012 を搭載したビルド マシンに問題があります。

他の誰かがこの問題を経験したことがありますか?もしそうなら、VS2012 をインストールしない以外に回避策を見つけましたか?

4

3 に答える 3

11

リフレクション ツールを使用して、ブートストラップ生成 MSBuild タスク (.NET 4.5 がインストールされたマシン上) を調べたところ、product.xmlファイルの<PackageFile />要素が拡張されていることがわかりました。具体的には、各ファイルから公開鍵を計算しようとします。見つかった場合は、キーとPublicKey属性の値を比較します。値が異なる場合、警告が発行されますが、どちらの場合も、計算したばかりの値が保持されます。

公開鍵を特定できなかった場合は、ファイルの SHA256 ハッシュを計算し、属性の値と同様の比較を実行しますHash。それらが異なる場合は警告を発しHash、計算された値で属性の値を設定します。

SETUPCFG結果からリソースを抽出することで、これらの調査結果を確認できますsetup.exeproduct.xmlこれは、ファイルのマージのテキスト バージョンです。

とにかく、公開鍵が見つからない場合、ファイルの SHA256 ハッシュを計算すると言ったことを覚えていますか? <PackageFiles> 要素 (Bootstrapper)のドキュメントには、属性の値はHashSHA1 hash である必要があると記載されています。

setup.exe結果が属性の値を検証するために SHA1 または SHA256 のどちらを使用するかを検証することはできませんでしたHash(これはアンマネージ コードであり、そのシンボルを見つけることができませんでした)。 4.0 バージョンのブートストラップ ジェネレーター MSBuild タスクは、実際にHash属性の値を計算するために SHA1 アルゴリズムを使用していることを明らかにしているため、推論によりsetup.bin(少なくとも Windows SDK v7.0A のものは) SHA1 を使用していると言えます。setup.binWindows SDK v8.0A のを使用してみましたが、同じ (間違った) 結果が得られたと確信しています。(これはsetup.bin、v8.0A SDK から .NET 4.0 専用のマシンにコピーして、setup.exeハッシュベースの検証を使用してカスタム ブートストラップ パッケージをインストールできるかどうかを確認することで確認できます)

そのため、セットアップ ブートストラップでハッシュベースの検証が壊れている場合は、代わりに少なくとも公開鍵 (証明書ベース) の検証を使用できます。幸いなことに、パッケージ ファイルから証明書の公開鍵を抽出できた場合、ブートストラップ ジェネレーターは自動的にこのメカニズムを使用して開始します。悪いニュースは、これは、各パッケージ ファイルがsigntool.exe有効なコード署名証明書で署名されている必要があることを意味します(すべての人がコード署名証明書を持っているわけではありません。

カスタム ブートストラップで使用されるパッケージ ファイルに署名すると、.NET 4.5 がインストールされたマシンを使用してプロジェクトをビルドすると、実行時にインストール エラーが発生しなくなりました。 .NET 4.5 がインストールされている。

tl;dr: .NET 4.5 で導入された欠陥を回避するために、コード署名証明書を使用してパッケージ ファイルに署名してください。

于 2013-01-11T04:51:31.183 に答える
1

GenerateBootstrapper パスを次から変更する必要があります。

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

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

次に、使用する msi パッケージを C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper から C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\ にコピーします。ブートストラップ

于 2015-05-14T00:03:50.160 に答える
1

以下から変更する必要がありますGenerateBootstrapper Path

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

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

于 2014-06-05T15:13:07.493 に答える