MSIEXEC를 사용하여 Python 3.8.1을 자동으로 제거할 수 없습니다.

MSIEXEC를 사용하여 Python 3.8.1을 자동으로 제거할 수 없습니다.

처음에는 MSI의 발견 항목을 사용하여 조직에 Python 3.8.1을 배포했습니다(해당하는 경우 WSUS Package Publisher를 통해).여기.각 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

그래서 저와 제 동료가 이 문제를 해결한 후, 상황과 실제로 무슨 일이 일어났는지 더 잘 이해하게 되었습니다. 이것은 우리가 원래 하려고 했던 것(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 설치를 선택하지 않았습니다. 런처가 381이 설치되지 않은 HKLM 키를 검색하고 있었기 때문입니다.

따라서 이 엄청난 혼란을 정리하려면 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

관련 정보