アンインストール コマンドがリリース モードでのみ失敗する
質問
コマンド ラインおよびカスタム Inno Setup インストーラーを使用して、サードパーティ アプリケーションを正常にアンインストールできます。
コマンドラインでの実行:
MSIEXEC.exe /x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn
Inno セットアップ コマンド:
[Run]
Filename: msiexec.exe; Flags: runhidden waituntilterminated;
Parameters: "/x {{14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
StatusMsg: "Uninstalling Service...";
次の C# コードをデバッグ モードで実行すると、プログラムでアプリケーションをアンインストールすることもできます。
C# コード:
string fileName = "MSIEXEC.exe";
string arguments = "/x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true
};
Process process = Process.Start(psi);
string errorMsg = process.StandardOutput.ReadToEnd();
process.WaitForExit();
ただし、同じ C# コードをコンパイルしてデプロイした Windows サービスとして実行すると、次のエラー出力が生成されます。
"This action is only valid for products that are currently installed."
追加コメント:
- Uninstallコマンドを発行しているWindowsサービスは、デバッグモードでテストされているコードと同じマシンで実行されています。Windowsサービスは、ローカルシステムアカウントとして実行/ログオンしています。
- アプリケーションログを参照して、実行されたコマンド引数がデバッグモードとリリースモードの両方で同じであることを検証しました。
- イベントビューアーに相談しましたが、手がかりは提供されません。
考えは?ご協力をいただければ幸いです。ありがとう。
解決 3
助けを提供してくれた人たちに感謝します。これは権限の問題のようです。管理者アカウントで実行するようにサービスを更新したところ、サードパーティのアプリケーションを正常にアンインストールできました。Orion の指摘では、ローカル システム アカウントはシステムへの完全なアクセス権を持つ強力なアカウントですが、 http://technet.microsoft.com/en-us/library/cc782435.aspx -- アンインストールを実行するために必要な権限がないようです。
[LocalSystem がインストールしたアプリケーションをアンインストールできることに関する詳細については、追加のコメントを参照してください。]
他のヒント
ステップ1: MSIエラーログファイルを確認してください
あなたの問題は LocalSystem として実行していることが原因ではないかと疑っています。
ローカル システム アカウントは、管理者権限を持つ通常のユーザー アカウントと同じではありません。ネットワークにアクセスできず、レジストリやファイル システムとのやり取りはまったく異なります。
メモリから、レジストリ内の「ホーム ディレクトリ」または HKCU への読み取り/書き込みリクエストは、実際にはデフォルトのユーザー プロファイル、または一時ディレクトリの場合のいずれかに入ります。 c:\windows\temp
以前にもインストール時に同様の問題に遭遇したことがあります。顧客がインストールに SYSTEM アカウントを使用していたため、非管理ユーザーに対してあらゆる種類の権限の問題が発生していました。
アプリケーションが「インストールされている」ように見えない場合、MSI ログ ファイルは実際には役に立ちません。まずは、次の出力をキャプチャすることから始めることをお勧めします。 MSIINV.EXE
システム アカウントの下で、現在インストールされているプログラム (またはユーザーがインストールしていると認識しているもの) の「インベントリ」を取得します。 http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx
おそらく、振り出しに戻って、アンインストールを行うために Windows サービスが本当に必要かどうかを確認する必要があると思います。まだ Vista の UAC の問題に遭遇していない場合は、おそらくあらゆる種類の Vista UAC の問題に遭遇するでしょう...
これは奇妙だ。LocalSystem はアプリケーションをインストールする特権を確実に持っているため (これが Windows Update と Active Directory でのソフトウェア展開の仕組みです)、アンインストールもできるはずです。
おそらく、アプリケーションは最初はマシンごとではなくユーザーごとにインストールされますか?
@ポール・ラロンド
アプリのインストーラーはカスタム InnoSetup インストーラー内にラップされています。InnoSetup インストーラーは、ログインしたユーザーによって手動で実行されます。ただし、アンインストールは、ローカル システム アカウントで実行されているサービスによってトリガーされます。
どうやら、あなたは何かを企んでいたようです。LocalSystem アカウントでサービスを実行し、アプリケーションをアンインストールする簡単なテストをまとめました。すべてが問題なく動作しました。あなたは正しかったです。LocalSystem アカウントには、インストール先のアプリケーションに対するアンインストール権限が必要です。あなたは窮地を救ってくれました。フィードバックをお寄せいただきありがとうございます!