MSIEXEC を使用して Python 3.8.1 をサイレントアンインストールできない

MSIEXEC を使用して Python 3.8.1 をサイレントアンインストールできない

私は最初に、MSIを使用してPython 3.8.1を組織に導入しました(該当する場合はWSUSパッケージパブリッシャー経由)。ここ。私は、各 MSI に対して次のコマンドを使用して、WSUS パッケージ パブリッシャーを使用してこれらの MSI をインストールしました。

msiexec.exe /i core.msi /qn /norestart ALLUSERS=1

残念ながら、何らかの理由で、これがいくつかの問題を引き起こしていましたが、それらはすべて、インストーラーの昇格が不足しているため (インストールされたアプリケーションの一覧に表示されない、py -0 の一覧に表示されない)、ALLUSERS=1 が無視されていることを示しているようでした。残念なことに、これらの問題に気付く前に、これらはすべて誤って全員に展開されていました。

クリーンアップするには、これらの MSI をアンインストールする必要があります。影響を受けるマシンでこれらの MSI を右​​クリックし、[アンインストール] をクリックすると、「アンインストールしてもよろしいですか?」というプロンプトが表示され、その後に昇格要求が表示され、期待どおりにアンインストールされます。

ただし、これをロールアウトできるように、サイレントで実行しようとしています。これは、昇格されたシェルで実行しようとしているコマンドです。

 msiexec.exe /x .\core.msi /qn

何も起こりません。タスク マネージャーで msiexec.exe がアクティビティなしで実行されているのがわかります。そのため、「よろしいですか?」プロンプトが表示され、そのプロンプトで停止しているのではないかと思います。

サイレントアンインストール中にこのプロンプトをバイパスするにはどうすればよいですか?

答え1

そこで、私と同僚がしばらくこのトラブルシューティングを行った結果、状況と実際に何が起こったのかをより深く理解することができました。これは、当初私たちがやろうとしていたこと (WSUS 経由で Python 3.8.1 MSI を展開する) を解決するものではありませんが、少なくともクリーンアップには役立ちます。WSUS パッケージ パブリッシャーやその他のものでこれに似たようなことを経験した他の管理者の役に立つことを願っています。

私たちは WSUS を通じて Python を展開しているので、すべてのローカル マシンは Python を NTAUTH\SYSTEM としてインストールします。これが、.MST (C:\Program Files\Python38) で指定した場所に Python が問題なく正しくインストールされた理由です。

何らかの理由で、Python MSI はすべて、.MST 内の ALLUSERS=1 呼び出しを無視し、それをパラメーターとして指定します。理由はわかりません (Python チームの誰か、またはより深い知識を持つ誰かがコメントしてくれるかもしれませんね? :) )。

私の理解/テストによると、この結果は、インストーラーが昇格されたプロセスとして実行されていないことを検出し、NTAUTH\SYSTEM のユーザーとして MSI をインストールし、Python ランチャーなどのキーを HKLM ではなく HKCU に配置することを意味します。ただし、.MST と NTAUTH\SYSTEM が持つアクセス権により、インストール ファイルは要求どおりに C:\Program Files\Python38 に配置されます。

これにより、インストールが失敗し、アンインストールがどうしても不可能になり、PATH が正しく設定されているにもかかわらず Python ランチャーが異常な動作をしていた理由が説明されます。

  • キーはすべてHKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\に配置されているため、インストールは失敗します。
  • インストールは成功したにもかかわらず、インストーラはインストールされたアプリケーションに表示されませんでした。これは、すべてのユーザーではなく NTAUTH\SYSTEM 用にインストールされたためです。
  • MSIEXEC 経由または MSI を右​​クリックしてアンインストールすると、インストールされていないと表示されます。これは、Python が技術的にはシステム (つまり、昇格時のすべてのユーザー) にも、アンインストールしようとしているユーザー (つまり、昇格なしの自分のユーザー アカウント) にもインストールされていないためです。
  • py -0 は、他のバージョンは取得しているにもかかわらず、Py38 インストールを取得していませんでした。これは、ランチャーが HKLM キーを検索していたためです。HKLM キーには 381 がインストールされていませんでした。

したがって、この大きな混乱を解消するには、すべての Python 3.8.1 MSI を NTAUTH\SYSTEM として、昇格なしでアンインストールする必要がありました。これを行うにはいくつかの方法があります。PSEXEC をダウンロードして使用し、CMD または Powershell をシステムとして起動し (psexec64.exe -sid powershell.exe)、それを介して MSIEXEC を実行するか、(私たちが採用した方法) マシン上にスケジュールされたタスクを作成し、最高権限なしで NTAUTH\SYSTEM として実行し、「Python 3.8.1*」プロパティを持つものをすべてアンインストールします。これを行うための簡単な Powershell スクリプトは次のとおりです。

$products = Get-WmiObject Win32_Product

foreach ($pkg in (
        "Python 3.8.1 Tcl*",
        "Python 3.8.1 Util*",
        "Python 3.8.1 Test*",
        "Python 3.8.1 Dev*",
        "Python 3.8.1 Documentation*",
        "Python 3.8.1 pip*",
        "Python 3.8.1 Standard*",
        "Python 3.8.1 Exe*",
        "Python 3.8.1 Core*",
        "Python 3.8.1 Add*",
        "Python Launcher*"
    )) {
    $products | Where-Object {
        ($_.Name -like $pkg)
    } | Select-Object -ExpandProperty LocalPackage | Foreach-Object {
        Start-Process -FilePath "msiexec.exe" -ArgumentList "/x $_ /QN" -Wait
    }
}

get-wmiobject Win32_Product | where-object {$_.Name -like "Python*"} | Format-Table Name, LocalPackage

関連情報