
我最初使用 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 正在運行但沒有任何活動,所以我的感覺是它正在達到“您確定嗎?”的狀態。提示並卡在該提示上。
如何在靜默卸載過程中繞過此提示?
答案1
因此,經過我和我的同事一段時間的檢查,我們對情況和實際發生的情況有了更好的了解。這並不能解決我們最初想要做的事情(透過 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 團隊的人或有更深入了解的人可以插話?:))。
根據我的理解/測試,這個結果意味著安裝程式偵測到它沒有作為提升的進程運行,因此以用戶NTAUTH\SYSTEM 的身份安裝MSI,對於NTAUTH\SYSTEM,將Python 啟動器等的金鑰放在HKCU中而不是 HKLM。但由於 .MST 和 NTAUTH\SYSTEM 具有的存取權限,它根據要求將安裝檔案放置在 C:\Program Files\Python38 中。
這解釋了為什麼安裝會失敗,無論如何卸載都是不可能的,以及為什麼儘管 PATH 設定正確,我們的 Python 啟動器仍表現得很奇怪。
- 安裝將會失敗,因為金鑰仍全部放置在 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\ 中
- 儘管安裝成功,但安裝程式從未出現在「已安裝的應用程式」中,因為它是為 NTAUTH\SYSTEM 而不是所有使用者安裝的
- 透過MSIEXEC 或右鍵點擊MSI 進行卸載會聲稱它沒有安裝,因為從技術上講,Python 既沒有為系統(也稱為提升後的所有用戶)安裝,也沒有為嘗試卸載它的用戶(也稱為我的用戶帳戶)安裝。
- 儘管選擇了其他版本,py -0 也沒有選擇 Py38 安裝,因為啟動器正在 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