Visual C++再頒布可能パッケージのトラブルシューティング
Visual C++再頒布可能パッケージのアップグレードに失敗する
現象
アプリケーションと一緒にVisual C++再頒布可能パッケージをインストールする構成にしていると、新規インストール時の失敗はあまり見かけないものの、既にインストール済みのためアップグレードとなる場合は失敗するケースを割と見かけます。特によく見られるものとしては、Windowsインストーラーのキャッシュが削除されたため、アップグレード時に行われる旧バージョンのアンインストールがうまくいかずに失敗しているケースが挙げられます。この場合、以下のようにキャッシュの参照を求めるメッセージのエラーダイアログが表示されます。
このとき、一時フォルダー(実行ユーザーの%temp%環境変数の場所)に出力されるdd_vcredistで始まるログファイルにはエラーコード0x80070643が記録されます。このエラーコードのうちエラーの意味を示す部分は0x0643=0n1603となりますが、残念ながらこの番号はドキュメントによるとERROR_INSTALL_FAILUREというただ失敗を示すだけのものになりますので、このログを見ただけでは何が起きたのか全く分かりません。
[042C:2230][2025-01-26T00:50:14]e000: Error 0x80070643: Failed to install MSI package.
[042C:2230][2025-01-26T00:50:14]e000: Error 0x80070643: Failed to execute MSI package.
[21D8:21D4][2025-01-26T00:50:14]e000: Error 0x80070643: Failed to configure per-machine MSI package.
[21D8:21D4][2025-01-26T00:50:14]i319: Applied execute package: vcRuntimeMinimum_x64, result: 0x80070643, restart: None
[21D8:21D4][2025-01-26T00:50:14]e000: Error 0x80070643: Failed to execute MSI package.
Windowsインストーラーキャッシュが削除されていることが原因であることを特定するためには、ファイル名にvcRuntimeMiminumやvcRuntimeAditionalを含むほうのログファイルを確認する必要があります。下記例のようにC:\Windows\Installer配下とC:\ProgramData\Package Cache配下の両方でファイルが見つからなかったことを示す以下のようなログが記録されている場合は、何らかの理由でWindowsインストーラーキャッシュが削除されていると判断できます。
MSI (s) (64:3C) [00:44:13:104]: Warning: Local cached package 'C:\Windows\Installer\57a8.msi' is missing.
...
MSI (s) (64:3C) [00:44:13:104]: SOURCEMGMT: Trying source C:\ProgramData\Package Cache\{3407B900-37F5-4CC2-B612-5CD5D580A163}v14.32.31332\packages\vcRuntimeMinimum_amd64\.
MSI (s) (64:3C) [00:44:13:104]: Note: 1: 2203 2: C:\ProgramData\Package Cache\{3407B900-37F5-4CC2-B612-5CD5D580A163}v14.32.31332\packages\vcRuntimeMinimum_amd64\vc_runtimeMinimum_x64.msi 3: -2147287037
MSI (s) (64:3C) [00:44:13:104]: SOURCEMGMT: Source is invalid due to missing/inaccessible package.
MicrosoftのドキュメントではWindowsインストーラーキャッシュを削除しないように注意喚起されていますが、インターネット上にはキャッシュを削除する方法やツールを紹介しているWebサイトが散見されますので、もしかするとそのような情報に騙されて削除してしまう方が多いのかもしれません。キャッシュが削除された場合に復旧する一般的な方法はドキュメントの公式情報によれば復旧以外にはなさそうですが、Visual C++再頒布可能パッケージについてはコンピューターを再セットアップする前に試せることがあります。2通りの手順を紹介しますので、この状況に遭遇した場合は試してみるとよいでしょう。
対処方法1.修復インストール
Windowsインストーラーには製品の構成を修復する機能がありますが、コントロールパネルや設定アプリから修復の操作を行った場合はWindowsインストーラーキャッシュを使用して実施します。そのため、今回のケースではコントロールパネルから修復を実施しても失敗する可能性が高いです。同一バージョンのインストーラーが入手できる場合や手元に残されている場合は、そのインストーラーを実行することでメンテナンスモードでインストーラーを起動して修復インストールを実施することが可能です。
コントロールパネルまたは設定アプリを起動します。
現在インストールされているVisual C++ Redistributableのバージョンを確認します。例えば次の図の場合バージョンは14.32.31332となります。
Visual C++再頒布可能パッケージのダウンロードリンクからバージョンとアーキテクチャ(x86, x64, ARM64)が合致するインストーラーをダウンロードします。
ダウンロードしたインストーラーを実行し、[修復]ボタンをクリックします。
インストーラーのウィザードの指示に沿って画面を進めます。コンピューターの再起動が求められた場合は再起動します。
新しいバージョンのVisual C++再頒布可能パッケージのインストーラーを実行し、問題が解消したか確認します。
対処方法2.トラブルシューティングツールを使用してインストール情報をクリーンアップする
Windowsインストーラーキャッシュが削除されている場合、トラブルシューティングツールを使用してインストール情報をクリーンアップすることができます。ただし、製品をアンインストールするためには元となったインストーラーが必要なはずなので、このツールが一体どのような方法でインストール情報をクリーンアップしているのか謎です。インストール情報だけを消してインストーラーがとりあえず実行可能な状態にしているだけな気がするので、他に方法がない場合の最終手段と個人的には考えています。
Microsoftのサポートサイトからトラブルシューティングツール(MicrosoftProgram_Install_and_Uninstall.meta.diagcab)をダウンロードします。
"MicrosoftProgram_Install_and_Uninstall.meta.diagcab"をダブルクリックしてトラブルシュートツールを起動します。
以下の画面が表示されますので、[次へ]ボタンをクリックします。
問題の種類を聞かれますので、[アンインストール]を選択します。
アプリケーションの一覧が表示されますので、"Microsoft Visual C++ <バージョン> <アーキテクチャ> Minimum Runtime - <バージョン>"を選択して[次へ]ボタンをクリックします。
実施してよいか聞かれますので、[はい、アンインストールを試行する]を選択します。
問題が解決されたら以下の画面に遷移しますので、ここで一旦トラブルシュートツールを終了します。
もう一度トラブルシュートを実行して同様に操作を進め、次はアプリケーションの一覧で"Microsoft Visual C++ <バージョン> <アーキテクチャ> Additional Runtime - <バージョン>"のアンインストールを試行します。
新しいバージョンのVisual C++再頒布可能パッケージのインストーラーを実行し、問題が解消したか確認します。
Visual C++ 2008以前の古い再頒布可能パッケージのインストールに失敗する
アプリケーションの前提条件としてCrystal reportsやVisual C++ 2008以前の古い再頒布可能パッケージをインストールしようとしたときにエラーとなることがあったため、原因と対処方法をまとめておきます。
現象
Error 1935/HRESULT:0x80070005のエラーでVisual C++ 2008再頒布可能パッケージのインストールに失敗する。
Error 1935.An error occurred during the installation of assembly 'Microsoft.VC90.ATL,version="9.0.30729.6161",publicKeyToken="1fc8b3b9a1e18e3b",processorArchitecture="amd64",type="win32"'. Please refer to Help and Support for more information. HRESULT: 0x80070005.
Error 1935のエラーでVisual C++ ランタイム(Microsoft.VC80.CRTやMicrosoft.VC90.ATL)を含む製品のインストールに失敗する。
Error 1935.An error occurred during the installation of assembly 'Microsoft.VC90.ATL,version="9.0.21009.1",publicKeyToken="1fc8b3b9a1e18e3b",processorArchitecture="amd64",type="win32"'. Please refer to Help and Support for more information.
原因
C:\Windows\WinSxS\InstallTempフォルダーのサブフォルダーにSYSTEMユーザーでファイルを書き込もうとしてACCESS DENIEDで失敗していました。
問題が起きなかった環境のアクセス権を調べるとSYSTEMユーザーはフルコントロールが許可されていました。また、継承元は「なし」になっていました。
問題が起きていた環境だと読み取りと実行しか許可されていませんでした。また、継承元は「C:\Windows\WinSxS\」になっていました。
より厳しいアクセス権となっているC:\Windows\WinSxS\からアクセス許可を引き継ぐ構成になってしまっていたことで、インストーラーがSYSTEMユーザーとして一時フォルダーに書き込み出来ない状態になっていました。このようになってしまった原因は分かりませんでしたが、恐らく何らかの理由でC:\Windows\WinSxS\InstallTempフォルダーを手動で削除してしまい、その後再作成した際に既定の動作としてアクセス許可を継承する構成になってしまったのだと思います。
対処方法
所有者をAdministratorsに変更し、SYSTEMユーザーにフルコントロールを与えることで解消しました。