Назад | Перейти на главную страницу

Невозможно удалить 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 работает без активности, поэтому я чувствую, что он достигает сообщения «Вы уверены?» подсказка и застревание на этой подсказке.

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

Итак, после некоторого времени, в течение которого я и мой коллега устраняли эту неполадку, мы лучше поняли ситуацию и то, что на самом деле произошло. Это не решает то, что мы пытались сделать изначально (развернуть Python 3.8.1 MSI через 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 вела себя странно, несмотря на правильную установку 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 как системы (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
    }
}