間違ってインストールしてしまったアプリケーションをPowerShellからアンインストールしたい

人間誰しも間違えはあります。
2021.06.02

間違っていらないアプリケーションをインストールしちゃった!!!

こんにちは、のん です。

皆さんは間違って不要なアプリケーションをインストールしたことはありますか? 私はあります。

手順書の文字が小さいとか、特定のサーバーだけインストールしなくても良いなどの細かい条件があったなど、言い訳はたくさんありますが、やらかしたことはあります。

アプリケーションをアンインストールしたいとき、RDP接続ができている場合は、以下のようにされることが多いと思います。

  • プログラムと機能から対象のアプリケーションを選択して、アンインストール
  • 事前に用意されているアンインストール用のEXEファイルを実行

しかし、SSMセッションマネージャーは使えるけど、わざわざポートフォワーディングしてRDP接続するのはめんどくさい場面も多いにあると思います。

そこで、PowerShellからアプリケーションをサクッとアンインストールしてみたいと思います。

いきなりまとめ

  • レジストリからアプリケーションをアンインストールするコマンドを確認して、実行する

検証用にAmazon Inspector エージェントをインストールする

検証用にAmazon Inspector エージェントをインストールします。

インストールは以下のようにSSM RunCommandから行います。

SSM RunCommandの実行結果を確認すると、正しくインストールされているようです。

念のためRDP接続をして、プログラムと機能を確認します。Amazon Inspector エージェントを示す、AWS Agentが一覧に存在していることが確認できます。

ちなみに公式ドキュメントでは、Amazon Inspector エージェントをアンインストールする際は、プログラムの追加と削除からアンインストールしてくださいと記載してあります。

エージェントをアンインストールするには

  1. Amazon Inspector エージェントをアンインストールする Windows ベースのオペレーティングシステムを実行している EC2 インスタンスにサインインします。

  2. EC2 インスタンスで、[コントロールパネル]、[プログラムの追加と削除] に移動します。

  3. インストールされたプログラムのリストで、[AWS Agent] を選択し、[Uninstall] を選択します。

Amazon Inspector エージェントのアンインストール

PowerShellでアプリケーションをアンインストールする

では、インストールしたAmazon Inspector エージェントを即アンインストールしてみます。

アンインストールの大まかな流れは、以下の通りです。

  1. アンインストール可能なアプリケーション情報が保存されているレジストリキーから、アンインストールしたいアプリケーションのレジストリ情報を取得する
  2. 取得したレジストリ情報から、以下のいずれかの条件に一致するコマンドを確認する (上から優先度が高い順)
    1. QuietUninstallStringxxx.exe /uninstall /quietとなっているもの
    2. UninstallStringMsiExec.exe /X xxx.msiとなっているもの
    3. UninstallStringxxx.exe /uninstallとなっているもの
    4. UninstallStringMsiExec.exe /I xxx.msiとなっているもの
  3. 確認したコマンドを実行する

優先度順の決め方は、サイレントアンインストールのコマンドを実行するためです。

SSMセッションマネージャーで接続している際に、サイレントアンインストールではなく、通常のアンインストールをしようとしてもアンインストールに失敗する可能性があります。

この原因は、SSMセッションマネージャーでは、通常のアンインストール時に出力されるウィザードが表示されないためです。ウィザードが表示されないがために、アンインストールの処理が途中で失敗してしまいます。

そのため、2.2.や、2.3.については表示されたコマンドをそのまま実行するのではなく、末尾に、/quietをつけてサイレントアンインストールするようにします。

2.4については、MsiExec.exe /X xxx.msi /quietに読み替えてコマンドを実行します。

なお、2.12.4のパターンに当てはまらないパターンもありますので、実行する際は自己責任でお願いします。

1.のレジストリ情報を取得するにあたっては、レジストリエディタで都度確認するのはとても面倒なので、対象のアプリケーションのレジストリ情報を取得するPowerShellを書きました。

PowerShellは以下の通りです。

# 対象のアプリケーションのレジストリ情報を取得する関数
function Get-TargetApplicationRegistry ([string]$uninstallableApplicationName, [string]$uninstallRegKey) {
  # レジストリキーのサブキーを取得する
  $uninstallSubRegKey = (Get-Item -Path $uninstallRegKey);

  # レジストリキーの"DisplayName"を確認し、アンインストールしたいアプリケーションだった場合は、そのレジストリ情報を表示する
  & {$uninstallSubRegKey.GetSubKeyNames()} | ForEach-Object{ 

    # アンインストール可能なアプリケーション情報が保存されているレジストリキーとそのサブレジストリキーを結合する
    # 例) Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{c59f5881-281a-4ef1-9aab-95446813b178}
    $regKey = $uninstallRegKey+"\"+$_; 
    
    # 結合したレジストリキーの値を取得
    $regKeyValue = (Get-Item -Path $regKey)
    
    # 結合したレジストリキーの"Display Name"を取得
    $displayName = $regKeyValue.GetValue("DisplayName")
    
    # 結合したレジストリキーの"Display Name"を確認し、アンインストールしたいアプリケーションだった場合は、そのレジストリ情報を表示する
    if($displayName -eq $uninstallableApplicationName){
      echo $regKeyValue
    }
  }
}

# アンインストールしたいアプリケーションの名前
$uninstallableApplicationName = "AWS Agent"

# 64bitマシンのアンインストール可能なアプリケーション情報が保存されているレジストリキー
$uninstallRegKey1 = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
$uninstallRegKey2 = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
$uninstallRegKey3 = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\"


# 対象のアプリケーションのレジストリ情報を取得する
Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey1
Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey2
Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey3

上述のPowerShellを実際に実行した時のログは以下の通りです。

PS C:\Windows\system32> # 対象のアプリケーションのレジストリ情報を取得する関数
PS C:\Windows\system32> function Get-TargetApplicationRegistry ([string]$uninstallableApplicationName, [string]$uninstallRegKey) {
>>   # レジストリキーのサブキーを取得する
>>   $uninstallSubRegKey = (Get-Item -Path $uninstallRegKey);
>>
>>   # レジストリキーの"DisplayName"を確認し、アンインストールしたいアプリケーションだった場合は、そのレジストリ情報を表示する
>>   & {$uninstallSubRegKey.GetSubKeyNames()} | ForEach-Object{
>>
>>     # アンインストール可能なアプリケーション情報が保存されているレジストリキーとそのサブレジストリキーを結合する
>>     # 例) Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{c59f5881-281a-4ef1-9aab-95446813b178}
>>     $regKey = $uninstallRegKey+"\"+$_;
>>
>>     # 結合したレジストリキーの値を取得
>>     $regKeyValue = (Get-Item -Path $regKey)
>>
>>     # 結合したレジストリキーの"Display Name"を取得
>>     $displayName = $regKeyValue.GetValue("DisplayName")
>>
>>     # 結合したレジストリキーの"Display Name"を確認し、アンインストールしたいアプリケーションだった場合は、そのレジストリ情報を表示する
>>     if($displayName -eq $uninstallableApplicationName){
>>       echo $regKeyValue
>>     }
>>   }
>> }
PS C:\Windows\system32>
PS C:\Windows\system32> # アンインストールしたいアプリケーションの名前
PS C:\Windows\system32> $uninstallableApplicationName = "AWS Agent"
PS C:\Windows\system32>
PS C:\Windows\system32> # 64bitマシンのアンインストール可能なアプリケーション情報が保存されているレジストリキー
PS C:\Windows\system32> $uninstallRegKey1 = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
PS C:\Windows\system32> $uninstallRegKey2 = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
PS C:\Windows\system32> $uninstallRegKey3 = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\"
PS C:\Windows\system32>
PS C:\Windows\system32>
PS C:\Windows\system32> # 対象のアプリケーションのレジストリ情報を取得する
PS C:\Windows\system32> Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey1


    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall


Name                           Property
----                           --------
{E4F0E562-EC3F-4729-9DB6-8E8B1 AuthorizedCDFPrefix :
5AEDADB}                       Comments            :
                               Contact             :
                               DisplayVersion      : 1.0.264.0
                               HelpLink            :
                               HelpTelephone       :
                               InstallDate         : 20210602
                               InstallLocation     :
                               InstallSource       : C:\ProgramData\Package Cache\{E4F0E562-EC3F-4729-9DB6-8E8B15AEDADB}v1.0.264.0\
                               ModifyPath          : MsiExec.exe /I{E4F0E562-EC3F-4729-9DB6-8E8B15AEDADB}
                               Publisher           : Amazon Web Services, Inc.
                               Readme              :
                               Size                :
                               EstimatedSize       : 14236
                               SystemComponent     : 1
                               UninstallString     : MsiExec.exe /I{E4F0E562-EC3F-4729-9DB6-8E8B15AEDADB}
                               URLInfoAbout        :
                               URLUpdateInfo       :
                               VersionMajor        : 1
                               VersionMinor        : 0
                               WindowsInstaller    : 1
                               Version             : 16777480
                               Language            : 1033
                               DisplayName         : AWS Agent


PS C:\Windows\system32> Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey2


    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall


Name                           Property
----                           --------
{c59f5881-281a-4ef1-9aab-95446 BundleCachePath      : C:\ProgramData\Package Cache\{c59f5881-281a-4ef1-9aab-95446813b178}\AWSAgentInstall.exe
813b178}                       BundleUpgradeCode    : {{E84A758A-09D7-4C8C-A937-2DC8CF2B5CAD}}
                               BundleAddonCode      : {}
                               BundleDetectCode     : {}
                               BundlePatchCode      : {}
                               BundleVersion        : 1.0.264.0
                               VersionMajor         : 1
                               VersionMinor         : 0
                               BundleProviderKey    : {c59f5881-281a-4ef1-9aab-95446813b178}
                               BundleTag            :
                               EngineVersion        : 3.11.1.2318
                               DisplayIcon          : C:\ProgramData\Package Cache\{c59f5881-281a-4ef1-9aab-95446813b178}\AWSAgentInstall.exe,0
                               DisplayName          : AWS Agent
                               DisplayVersion       : 1.0.264.0
                               Publisher            : Amazon Web Services, Inc.
                               ModifyPath           : "C:\ProgramData\Package Cache\{c59f5881-281a-4ef1-9aab-95446813b178}\AWSAgentInstall.exe" /modify
                               NoElevateOnModify    : 1
                               QuietUninstallString : "C:\ProgramData\Package Cache\{c59f5881-281a-4ef1-9aab-95446813b178}\AWSAgentInstall.exe" /uninstall /quiet
                               UninstallString      : "C:\ProgramData\Package Cache\{c59f5881-281a-4ef1-9aab-95446813b178}\AWSAgentInstall.exe"  /uninstall
                               EstimatedSize        : 21758
                               Resume               : 3
                               Installed            : 1


PS C:\Windows\system32> Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey3
PS C:\Windows\system32>

レジストリ情報を確認すると、以下の 1 に一致しているコマンドがありますね。

  1. QuietUninstallStringxxx.exe /uninstall /quietとなっているもの
  2. UninstallStringMsiExec.exe /X xxx.msiとなっているもの
  3. UninstallStringxxx.exe /uninstallとなっているもの
  4. UninstallStringMsiExec.exe /I xxx.msiとなっているもの

そのため、アンインストールする際は、一致したコマンドである"C:\ProgramData\Package Cache\{c59f5881-281a-4ef1-9aab-95446813b178}\AWSAgentInstall.exe" /uninstall /quietを実行します。

なお、コマンドを実行する際は、以下のように適切な位置にダブルクォーテーション(")を入れます。

C:\ProgramData\"Package Cache"\"{c59f5881-281a-4ef1-9aab-95446813b178}"\AWSAgentInstall.exe  /uninstall /quiet

実際にコマンドを実行した時のログは以下の通りです。

PS C:\Windows\system32> C:\ProgramData\"Package Cache"\"{c59f5881-281a-4ef1-9aab-95446813b178}"\AWSAgentInstall.exe  /uninstall /quiet
PS C:\Windows\system32>
PS C:\Windows\system32>
PS C:\Windows\system32> Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey1
PS C:\Windows\system32> Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey2
PS C:\Windows\system32> Get-TargetApplicationRegistry $uninstallableApplicationName $uninstallRegKey3

Get-TargetApplicationRegistryで再度レジストリ情報を確認しても、何も表示されないことからアンインストールできたと判断できます。

念の為、RDP接続をしてプログラムと機能からインストール済みのアプリケーションを確認しましたが、一覧から消えていました。めでたし、めでたし。

困ったらレジストリ情報を見てみる

ご丁寧にレジストリにアンインストールするためのコマンドが書いてあるので、これを使わない手はないということで、このようなアプローチでブログを書いてみました。

ただ、いきなりレジストリ情報を見るのではなく、まずは公式ドキュメントを確認して、アンインストール方法を確認してみるようにお願いします。UninstallStringに記載されているコマンドを実行しても、何も反応がないパターンもあります。

このブログが誰かの助けになれば幸いです。

以上、東京オフィスの のん(@non____97)でした!