
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