none
プログラムのアンインストール RRS feed

  • 質問

  • ここで質問する内容ではないかも知れませんが。環境がVC++ 2008 MFCのためここで質問させてください。

     

    システムに必要ないプログラムをリスト(外部ファイル)に従ってアンインストールするプログラムを作成しています。

     

    簡単な手順

    1. レジストリ[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall]からインストールプログラムを取得
    2. リストにあるプログラムの場合は[UninstallString]の内容を実行

    ここで疑問なんですが、
    [UninstallString]に記述されている内容を実行した時の表示とコントロールパネルからプログラムを指定しアンインストールを実行した時の表示が異なる場合があります。

     

    再現
    当方の環境では「Adobe Reader 8.1.2 - Japanese」で再現します。バージョン違い,OS違い(VISTA, XP)でも再現してます。

    • [UninstallString]の内容を[ファイル名を指定して実行]で実行する。
    • コントロールパネルからプログラムを指定しアンインストールを実行する。

    出力されるダイアログが違います。

     

    コントロールパネルからプログラムを指定しアンインストールを行った場合、どのようなプログラムが実行されているか教えてください。(コントロールパネルからの結果と同様になるように要望されています)

     

    以上、よろしくお願い致します。

    2008年9月10日 7:13

回答

  • Adobe Reader 8.1.2 - Japanese がたまたま、私のVistaマシンにもいたのでちょっと調査してみました。

     

    この製品は、Windows Installer を利用していますね。この場合、単純に UninstallString を呼び出すと、追加と削除ボタンを押した場合と同じ動作をします。

    #動かしてみればわかります。

     

    Windows Installer を使っているかどうかの判断は、該当するレジストリキーにWindowsInstallerというDWORD値があるか、あったらそれが1になっているか?で判断できます。

     

    そして、Windows Installer を利用している場合は、そちらの手順でアンインストール作業をさせる必要があるということになります。
    #OS自身も自身の勝手知ったるコンポーネントなので特別扱いしています。

     

    Windows Installer を利用した製品のアンインストールは

    msiexec /X {...} /qb という形で呼び出します。細かな引数等々はMSDNライブラリに詳細が出てますのでそちらを参照してください。

     

    また、Windows Installer SDK(こちらもMSDNライブラリ(英語部分)に格納されています)に、Uninstall キーのことも記述されていますので、それらも同時に調査しておくことをお勧めします。

     

    あと、社内にそれなりに詳しい人間がいるのであれば、まずはその人からいろいろ聞きだして、場合によってはレビューもしてもらってください。対象を間違ってアンインストール作業を行うと、最悪の状況を招いてしまうということも起こりえますので。

     

    インストール・アンインストールという作業は、システムから見れば一種の破壊行為です。それだけに誤った操作は致命的な状況を招くことになりかねないということになりますので。

    2008年9月10日 9:13

すべての返信

  • Adobe Reader 8.1.2 - Japanese がたまたま、私のVistaマシンにもいたのでちょっと調査してみました。

     

    この製品は、Windows Installer を利用していますね。この場合、単純に UninstallString を呼び出すと、追加と削除ボタンを押した場合と同じ動作をします。

    #動かしてみればわかります。

     

    Windows Installer を使っているかどうかの判断は、該当するレジストリキーにWindowsInstallerというDWORD値があるか、あったらそれが1になっているか?で判断できます。

     

    そして、Windows Installer を利用している場合は、そちらの手順でアンインストール作業をさせる必要があるということになります。
    #OS自身も自身の勝手知ったるコンポーネントなので特別扱いしています。

     

    Windows Installer を利用した製品のアンインストールは

    msiexec /X {...} /qb という形で呼び出します。細かな引数等々はMSDNライブラリに詳細が出てますのでそちらを参照してください。

     

    また、Windows Installer SDK(こちらもMSDNライブラリ(英語部分)に格納されています)に、Uninstall キーのことも記述されていますので、それらも同時に調査しておくことをお勧めします。

     

    あと、社内にそれなりに詳しい人間がいるのであれば、まずはその人からいろいろ聞きだして、場合によってはレビューもしてもらってください。対象を間違ってアンインストール作業を行うと、最悪の状況を招いてしまうということも起こりえますので。

     

    インストール・アンインストールという作業は、システムから見れば一種の破壊行為です。それだけに誤った操作は致命的な状況を招くことになりかねないということになりますので。

    2008年9月10日 9:13
  • とっちゃんさん ありがとうございます。

     

    次のように解釈してよろしいのでしょうか。

    1. WindowsInstallerの値が1のものは、
    2. コントロールパネルからからアンインストールを行うと
    3. UninstallStringの内容ではなく
    4. "msiexec /Xキー名 /qb"が実行される。(キー名には{}が含まれる)

    確かに、4を実行するとコントロールパネルから行ったものと同様の処理になりました。

     

     とっちゃん さんからの引用

    あと、社内にそれなりに詳しい人間がいるのであれば、まずはその人からいろいろ聞きだして、場合によってはレビューもしてもらってください。対象を間違ってアンインストール作業を行うと、最悪の状況を招いてしまうということも起こりえますので。

    残念ながら社内にそれなりの人はおりません。

    対象を間違えてアンインストールを行うことのないようにプログラムを作成しています。

     

    たいへん参考になりました。
    2008年9月11日 2:39
  •  myoko さんからの引用

    次のように解釈してよろしいのでしょうか。

    1. WindowsInstallerの値が1のものは、
    2. コントロールパネルからからアンインストールを行うと
    3. UninstallStringの内容ではなく
    4. "msiexec /Xキー名 /qb"が実行される。(キー名には{}が含まれる)

    確かに、4を実行するとコントロールパネルから行ったものと同様の処理になりました。

     

    正確には相当の処理をする。です。msiexec を動かしてるかは確認してませんが起動プロセスがほんの少しだけ異なるので多分、同様の処理となっているだけと思います。

     

     myoko さんからの引用

    残念ながら社内にそれなりの人はおりません。

    対象を間違えてアンインストールを行うことのないようにプログラムを作成しています。

     

    なるほど。他の人がアンインストールを誤ってしまわぬようにということなんですね。

    となると、地道に細かく調査しながらとなりそうですね。

     

    ちなみに、WindowsInstaller の場合でも、SystemComponent という値がセットされている場合は、追加と削除には出てこないものとなっています。

    UninstallKey 自体細かな部分はほぼアンドキュメントになっているので(値そのものとWindows Installer のプロパティとのリンクだけは出てますが...)、各社で勝手に設定しているところがあったりするのでご注意を。

    2008年9月11日 3:29