間違ってインストールしてしまったアプリケーションをPowerShellからアンインストールしたい
間違っていらないアプリケーションをインストールしちゃった!!!
こんにちは、のんピ です。
皆さんは間違って不要なアプリケーションをインストールしたことはありますか? 私はあります。
手順書の文字が小さいとか、特定のサーバーだけインストールしなくても良いなどの細かい条件があったなど、言い訳はたくさんありますが、やらかしたことはあります。
アプリケーションをアンインストールしたいとき、RDP接続ができている場合は、以下のようにされることが多いと思います。
プログラムと機能
から対象のアプリケーションを選択して、アンインストール- 事前に用意されているアンインストール用のEXEファイルを実行
しかし、SSMセッションマネージャーは使えるけど、わざわざポートフォワーディングしてRDP接続するのはめんどくさい場面も多いにあると思います。
そこで、PowerShellからアプリケーションをサクッとアンインストールしてみたいと思います。
いきなりまとめ
- レジストリからアプリケーションをアンインストールするコマンドを確認して、実行する
検証用にAmazon Inspector エージェントをインストールする
検証用にAmazon Inspector エージェントをインストールします。
インストールは以下のようにSSM RunCommandから行います。
SSM RunCommandの実行結果を確認すると、正しくインストールされているようです。
念のためRDP接続をして、プログラムと機能
を確認します。Amazon Inspector エージェントを示す、AWS Agent
が一覧に存在していることが確認できます。
ちなみに公式ドキュメントでは、Amazon Inspector エージェントをアンインストールする際は、プログラムの追加と削除
からアンインストールしてくださいと記載してあります。
エージェントをアンインストールするには
- Amazon Inspector エージェントをアンインストールする Windows ベースのオペレーティングシステムを実行している EC2 インスタンスにサインインします。
EC2 インスタンスで、[コントロールパネル]、[プログラムの追加と削除] に移動します。
インストールされたプログラムのリストで、[AWS Agent] を選択し、[Uninstall] を選択します。
PowerShellでアプリケーションをアンインストールする
では、インストールしたAmazon Inspector エージェントを即アンインストールしてみます。
アンインストールの大まかな流れは、以下の通りです。
- アンインストール可能なアプリケーション情報が保存されているレジストリキーから、アンインストールしたいアプリケーションのレジストリ情報を取得する
- 取得したレジストリ情報から、以下のいずれかの条件に一致するコマンドを確認する (上から優先度が高い順)
QuietUninstallString
がxxx.exe /uninstall /quiet
となっているものUninstallString
がMsiExec.exe /X xxx.msi
となっているものUninstallString
がxxx.exe /uninstall
となっているものUninstallString
がMsiExec.exe /I xxx.msi
となっているもの
- 確認したコマンドを実行する
優先度順の決め方は、サイレントアンインストールのコマンドを実行するためです。
SSMセッションマネージャーで接続している際に、サイレントアンインストールではなく、通常のアンインストールをしようとしてもアンインストールに失敗する可能性があります。
この原因は、SSMセッションマネージャーでは、通常のアンインストール時に出力されるウィザードが表示されないためです。ウィザードが表示されないがために、アンインストールの処理が途中で失敗してしまいます。
そのため、2.2.
や、2.3.
については表示されたコマンドをそのまま実行するのではなく、末尾に、/quiet
をつけてサイレントアンインストールするようにします。
2.4
については、MsiExec.exe /X xxx.msi /quiet
に読み替えてコマンドを実行します。
なお、2.1
〜2.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
に一致しているコマンドがありますね。
QuietUninstallString
がxxx.exe /uninstall /quiet
となっているものUninstallString
がMsiExec.exe /X xxx.msi
となっているものUninstallString
がxxx.exe /uninstall
となっているものUninstallString
がMsiExec.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
に記載されているコマンドを実行しても、何も反応がないパターンもあります。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!