无法使用 MSIEXEC 静默卸载 Python 3.8.1

无法使用 MSIEXEC 静默卸载 Python 3.8.1

我最初在我们的组织中部署了 Python 3.8.1(如果相关,通过 WSUS Package Publisher),使用 MSI 找到这里。我使用 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

相关内容