Windows

無法使用 MSIEXEC 靜默解除安裝 Python 3.8.1

  • February 25, 2020

我最初使用此處找到的 MSI 在我們的組織中部署了 Python 3.8.1(如果相關,則通過 WSUS Package Publisher)我使用 WSUS Package Publisher 安裝了這些 MSI,並為每個 MSI 使用以下命令:

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

不幸的是,由於某種原因,這對我造成了許多問題,這些問題似乎都指向 ALLUSERS=1 被忽略,可能是由於安裝程序缺乏提升(未出現在已安裝的應用程序列表中,未通過 py 出現 - 0 列表)。令人沮喪的是,在我們意識到這些問題之前,這些都被意外地部署到了每個人身上。

要清理,我現在需要解除安裝這些 MSI。在受影響的機器上右鍵點擊這些 MSI 並點擊“解除安裝”可以正常工作 - 我會看到“您確定要解除安裝嗎?” 提示,然後是提升請求,然後按預期解除安裝。

但是,因為我試圖默默地這樣做,以便我可以推出它。這是我試圖通過提升的 shell 執行的命令:

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

沒發生什麼事。我可以在任務管理器中看到 msiexec.exe 正在執行而沒有任何活動,所以我的感覺是它正在達到“你確定嗎?” 提示並卡在該提示上。

如何在靜默解除安裝期間繞過此提示?

因此,在我和我的同事對此進行了一段時間的故障排除後,我們對情況和實際發生的情況有了更好的了解。這並不能解決我們最初嘗試做的事情(通過 WSUS 部署 Python 3.8.1 MSI),但它至少可以幫助我們清理。希望這可以幫助其他可能在 WSUS Package Publisher 或其他方面經歷過類似情況的管理員!

我們通過 WSUS 部署 Python,這意味著所有本地電腦都將 Python 安裝為 NTAUTH\SYSTEM。這解釋了為什麼 Python 在我在 .MST 中指定的位置(C:\Program Files\Python38)中正確安裝,沒有任何抱怨。

出於某種原因,Python MSI 都忽略了 .MST 中的 ALLUSERS=1 呼叫,並將其指定為參數。不知道為什麼(也許 Python 團隊的某個人或有更深入了解的人可以加入?:))。

這意味著,根據我的理解/測試,安裝程序檢測到它沒有作為提升的程序執行,因此將 MSI 安裝為使用者 NTAUTH\SYSTEM,對於 NTAUTH\SYSTEM,將 Python 啟動器等的密鑰放在 HKCU而不是HKLM。但由於 .MST 和 NTAUTH\SYSTEM 擁有的訪問權限,它會按要求將安裝文件放在 C:\Program Files\Python38 中。

這解釋了為什麼安裝會失敗,無論如何都無法解除安裝,以及為什麼我們的 Python 啟動器在 PATH 設置正確的情況下表現異常。

  • 安裝將失敗,因為密鑰仍將全部放在 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\
  • 儘管安裝成功,安裝程序從未出現在已安裝的應用程序中,因為它是為 NTAUTH\SYSTEM 而不是為所有使用者安裝的
  • 通過 MSIEXEC 或通過右鍵點擊 MSI 進行解除安裝會聲稱它沒有安裝,因為從技術上講,系統沒有為系統(即提升時的所有使用者)安裝 Python,也沒有為嘗試解除安裝它的使用者(即我的使用者帳戶,沒有海拔)。
  • py -0 儘管選擇了其他版本,但沒有選擇 Py38 安裝,因為啟動器正在搜尋未安裝 381 的 HKLM 密鑰。

因此,為了清理這個巨大的混亂,我們需要將所有 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 Dev*",
       "Python 3.8.1 pip*",
       "Python Launcher*",
       "Python 3.8.1 Exe*",
       "Python 3.8.1 Standard*",
       "Python 3.8.1 Core*",
       "Python 3.8.1 Documentation*",
       "Python 3.8.1 Test*",
       "Python 3.8.1 Add*"
   )) {
   $products | Where-Object {
       ($_.Name -like $pkg)
   } | Select-Object -ExpandProperty LocalPackage | Foreach-Object {
       msiexec.exe /x $_ /QN
   }
}

引用自:https://serverfault.com/questions/1001105