Невозможно удалить Python 3.8.1 в фоновом режиме с помощью MSIEXEC

Невозможно удалить Python 3.8.1 в фоновом режиме с помощью MSIEXEC

Первоначально я развернул Python 3.8.1 в нашей организации (через WSUS Package Publisher, если применимо), используя найденные MSI-файлыздесь.Я установил эти MSI с помощью WSUS Package Publisher, выполнив следующую команду для каждого MSI:

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

К сожалению, по какой-то причине это вызвало у меня ряд проблем, которые, как мне показалось, все указывали на игнорирование ALLUSERS=1, возможно, из-за отсутствия повышения прав установщика (не отображалось в списке установленных приложений, не отображалось в списке py -0). К сожалению, все это было случайно развернуто у всех, прежде чем мы осознали эти проблемы.

Чтобы очистить, мне теперь нужно удалить эти MSI. Щелчок правой кнопкой мыши по этим MSI на затронутой машине и нажатие «Удалить» срабатывает — я получаю запрос «Вы уверены, что хотите удалить?», за которым следует запрос на повышение прав, а затем удаление происходит, как и ожидалось.

Однако, поскольку я пытаюсь сделать это молча, чтобы иметь возможность развернуть это. Это команда, которую я пытаюсь запустить через повышенную оболочку:

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

Ничего не происходит. Я вижу в диспетчере задач, что msiexec.exe работает без активности, поэтому мне кажется, что он доходит до запроса «Вы уверены?» и зависает на этом запросе.

Как обойти это приглашение во время тихого удаления?

решение1

Итак, после некоторого времени, которое я и мой коллега потратили на устранение неполадок, мы лучше поняли ситуацию и то, что на самом деле произошло. Это не решает то, что мы пытались сделать изначально (развернуть MSI Python 3.8.1 через WSUS), но, по крайней мере, помогает нам навести порядок. Надеюсь, это поможет другому администратору, который, возможно, столкнулся с чем-то подобным с WSUS Package Publisher или чем-то еще!!

Мы развертываем Python через WSUS, поэтому все локальные машины устанавливают Python как NTAUTH\SYSTEM. Это объясняет, почему Python устанавливался правильно, без проблем, в место, которое я указал в .MST (C:\Program Files\Python38).

По какой-то причине все MSI Python игнорируют вызов ALLUSERS=1 в .MST, и, указав его в качестве параметра, не знаю почему (может, кто-то из команды Python или кто-то с более глубоким пониманием мог бы подсказать? :) ).

Результат этого означает, насколько я понимаю/тестировал, что установщик обнаруживает, что он не запущен как процесс с повышенными правами, и поэтому устанавливает MSI как пользователь NTAUTH\SYSTEM, для NTAUTH\SYSTEM, помещая ключи для запуска Python и т. д. в HKCU вместо HKLM. Но из-за .MST и прав доступа, которые есть у NTAUTH\SYSTEM, он помещает файлы установки в C:\Program Files\Python38, как и требовалось.

Это объясняет, почему установки не удавалось выполнить, удаление было невозможно ни при каких обстоятельствах и почему наш Python Launcher вел себя странно, несмотря на то, что PATH был настроен правильно.

  • Установка не будет выполнена, поскольку все ключи по-прежнему будут находиться в HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\
  • Установщики не появились в списке установленных приложений, несмотря на успешную установку, поскольку они были установлены для NTAUTH\SYSTEM, а не для всех пользователей.
  • Удаление через MSIEXEC или щелчком правой кнопкой мыши по MSI-файлу приведет к выводу, что он не установлен, поскольку Python технически не был установлен ни для системы (т. е. для всех пользователей при повышенных правах), ни для пользователя, пытающегося удалить его (т. е. для моей учетной записи без повышенных прав).
  • py -0 не распознавал установку Py38, хотя распознавал другие версии, поскольку лаунчер выполнял поиск в ключах HKLM, в которые 381 не устанавливался.

Итак, чтобы убрать этот огромный беспорядок, нам нужно было удалить все MSI Python 3.8.1 как NTAUTH\SYSTEM и без повышения прав. Есть несколько способов сделать это - либо загрузить и использовать PSEXEC для запуска CMD или Powershell как System (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

Связанный контент