この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
間違っていらないアプリケーションをインストールしちゃった!!!
こんにちは、のんピ です。
皆さんは間違って不要なアプリケーションをインストールしたことはありますか? 私はあります。
手順書の文字が小さいとか、特定のサーバーだけインストールしなくても良いなどの細かい条件があったなど、言い訳はたくさんありますが、やらかしたことはあります。
アプリケーションをアンインストールしたいとき、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)でした!