Não é possível desinstalar o Python 3.8.1 silenciosamente usando MSIEXEC

Não é possível desinstalar o Python 3.8.1 silenciosamente usando MSIEXEC

Inicialmente, implantei o Python 3.8.1 em nossa organização (por meio do WSUS Package Publisher, se relevante) usando o MSI encontradoaqui.Instalei esses MSI usando o WSUS Package Publisher com o seguinte comando para cada MSI:

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

Infelizmente, por algum motivo, isso estava causando uma série de problemas para mim, que pareciam apontar para ALLUSERS=1 sendo ignorado, possivelmente devido à falta de elevação do instalador (não aparecendo na lista de Aplicativos Instalados, não aparecendo através do py - 0 lista). Frustrantemente, tudo isso foi acidentalmente implantado para todos antes de percebermos esses problemas.

Para limpar, agora preciso desinstalar esses MSIs. Clicar com o botão direito nesses MSIs na máquina afetada e clicar em "Desinstalar" funciona - recebo uma mensagem "Tem certeza de que deseja desinstalar?" prompt, seguido pela solicitação de elevação e, em seguida, ele é desinstalado conforme esperado.

No entanto, estou tentando fazer isso silenciosamente para poder implementar. Este é o comando que estou tentando executar através de um shell elevado:

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

Nada acontece. Posso ver no Gerenciador de Tarefas que msiexec.exe está sendo executado sem atividade, então sinto que está atingindo a mensagem "Tem certeza?" prompt e ficar preso nesse prompt.

Como posso ignorar esse prompt durante a desinstalação silenciosa?

Responder1

Então, depois de algum tempo eu e meu colega resolvendo isso, entendemos melhor a situação e o que realmente aconteceu. Isso não resolve o que estávamos tentando fazer originalmente (implantar MSI do Python 3.8.1 por meio do WSUS), mas pelo menos nos ajuda a limpar. Esperamos que isso ajude outro administrador que possa ter experimentado algo semelhante a isso com o WSUS Package Publisher ou algo mais!!

Estamos implantando o Python por meio do WSUS, o que significa que todas as máquinas locais instalam o Python como NTAUTH\SYSTEM. Isso explica porque o Python foi instalado corretamente, sem reclamações, no local que especifiquei no .MST (C:\Arquivos de Programas\Python38).

Por alguma razão, todos os MSI do Python ignoram a chamada ALLUSERS=1 no .MST e especificam-na como um parâmetro. Não faço ideia do porquê (talvez alguém da equipe Python ou alguém com um conhecimento mais profundo possa intervir? :)).

O resultado disso significa, pelo meu entendimento/teste, que o instalador detecta que não está sendo executado como um processo elevado e, portanto, instala o MSI como usuário NTAUTH\SYSTEM, para NTAUTH\SYSTEM, colocando as chaves para o iniciador Python etc. em vez de HKLM. Mas por causa do .MST e dos direitos de acesso que NTAUTH\SYSTEM possui, ele coloca os arquivos de instalação em C:\Program Files\Python38 conforme solicitado.

Isso explica por que as instalações falhavam, a desinstalação era impossível de qualquer maneira e por que nosso Python Launcher estava se comportando de maneira estranha, apesar do PATH estar configurado corretamente.

  • As instalações falhariam porque todas as chaves ainda seriam colocadas no arquivo HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\
  • Os instaladores nunca apareceram em Aplicativos Instalados, apesar da instalação bem-sucedida, porque foi instalado para NTAUTH\SYSTEM e não para Todos os Usuários
  • A desinstalação por meio do MSIEXEC ou clicando com o botão direito do mouse no MSI alegaria que ele não foi instalado, porque o Python não foi tecnicamente instalado nem para o sistema (também conhecido como Todos os usuários quando elevado), nem para o usuário que está tentando desinstalá-lo (também conhecido como minha conta de usuário, sem elevação).
  • py -0 não estava selecionando a instalação do Py38, apesar de selecionar outras versões, porque o inicializador estava pesquisando nas chaves HKLM, nas quais 381 não estava instalando.

Então, para limpar essa enorme bagunça, precisávamos desinstalar todos os MSI do Python 3.8.1 como NTAUTH\SYSTEM e sem elevação. Existem várias maneiras de fazer isso - baixando e usando PSEXEC para iniciar um CMD ou Powershell como sistema (psexec64.exe -sid powershell.exe) e executando MSIEXEC através disso, ou (a abordagem que adotamos) criando uma tarefa agendada em a máquina, execute-a como NTAUTH\SYSTEM, sem os privilégios mais altos, e desinstale qualquer coisa que tenha a propriedade "Python 3.8.1*". Um script rápido do Powershell para isso:

$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

informação relacionada