無法使用 MSIEXEC 靜默解除安裝 Python 3.8.1
我最初使用此處找到的 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 } }