GUID(0733556C-37E8-4123-A801-D3E6C5151617)を使用してMSIをインストールしました。レジストリに登録されているプログラム:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall \()
値UninstallString = MsiExec.exe/I(0733556C-37E8-4123-A801-D3E6C5151617)
私の質問は、ユーティリティMsiExec.exeが、プログラムを削除するときに実行するファイルの名前とパスをどのように認識しているかということです。レジストリのどこにこの情報がありますか?
Windowsは、Windowsインストーラーの構成情報をレジストリで非表示にして暗号化します。レジストリの他の部分とは異なり、人間の目で閲覧することはできません。
この情報を照会/変更/削除するには、MSI関数を使用する必要があります。
( インストーラー関数リファレンス )
特定の質問については、関数 MsiGetProductInfo を試してください。
これは、William Learaが言うように、MsiGetProductInfoを使用してディスク上のキャッシュされたインストーラーの実際の場所を取得する単純なc#プログラムです。
class Program
{
static void Main(string[] args)
{
Int32 len = 512;
System.Text.StringBuilder builder = new System.Text.StringBuilder(len);
MsiGetProductInfo("{89C098E5-C108-49F9-9B1D-10503C6D8A05}", "LocalPackage", builder, ref len);
Console.WriteLine(builder.ToString());
Console.ReadLine();
}
[DllImport("msi.dll", CharSet = CharSet.Unicode)]
static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len);
}
コマンドラインから試すことができます:
wmic product where "Name like '%your software here%'" get Name, Version, PackageCode
アンインストールを実行するときにレジストリのUninstallStringが使用されないため、この質問の前提は誤解を招く可能性があります。先に進み、文字列を変更してこれをテストします-変更された文字列は使用されません。
レジストリ内のものへの参照は魅力的かもしれませんが、簡単な答えは、レジストリ内のWindowsインストーラデータが実装の詳細であるということです。問題は基本的にMsiConfigureProduct(.... INSTALLSTATE_ABSENT ...)がどのように機能するかを尋ねることであり、実装の詳細とそれがレジストリのどこにあるかを推測するのは無意味です。それはずっと下のAPIです。ポスターが達成したいと思っていたかもしれない実際のタスクがあったかもしれませんが、それはアンインストールがどのように機能するかという質問によって隠されています。
Tarma Software Researchから無料のユーティリティがあり、これに役立ちました。 彼らのウェブサイト から入手してください。
ソフトウェアは必要ありません。これはWindows10で機能しており、Windows7でも有効だと思います。
製品コードが0733556C-37E8-4123-A801-D3E6C5151617の場合。キーC65533708E7332148A103D6E5C516171(基本的には逆になっています)を見つけたら、InstallPropertiesサブキーを参照します。存在しない場合は、他の結果を見つけてください。 InstallPropertiesを見つけたら、LocalPackageキーを開いて見つけます。そして、アプリケーションをインストールしたときにMSIがキャッシュとして保存するmsiパッケージのパスがあります。
そのキーはHKEY_CLASSES_ROOT\Installer\Products\
にマップされます。