패치,
제거([**제거 방법**][1]) 및 **`감사 목적
과 같은 유지 관리를 수행하려면 설치된 MSI 파일의 제품 GUID를 찾아야 합니다.
업그레이드 코드** 검색을 위해:
https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095
짧은 버전
아래 정보는 시간이 지남에 따라 상당히 늘어났으며 너무 복잡해졌을 수 있습니다. 제품 코드를 빠르게 얻는 방법 (네 가지 접근 방식):
파워쉘 '원라이너'를 사용하세요.
아래로 스크롤하여 스크린샷 및 단계별을 확인하세요. 아래에도 면책 조항이 있습니다 - 문의하는 사람에 따라 경미하거나 중간 정도의 위험이 있습니다. 저에게는 정상적으로 작동합니다. 이 옵션으로 트리거된 모든 자가 복구는 일반적으로 취소할 수 있습니다. 하지만 패키지 무결성 검사가 트리거되면 이벤트 로그에 약간의 노이즈가 추가됩니다. 참고! '식별 번호'는 '제품 코드'입니다(WMI 특성).
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
어떤 사람들은 레지스트리에서 무언가를 찾아서 맹세합니다. 저는 적절한 API(즉, OS 함수 호출)를 사용하는 것을 선호합니다. API 구현의 내부에서만 설명되는 이상한 예외가 항상 존재하기 때문입니다:
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
][2]는 모든 MSI 파일(및 기타 속성)의
프로퍼티 테이블][3]에서 찾을 수 있습니다. 그러나 설치 시 적용된 변환에 의해 GUID가 재정의되어 제품이 등록되어 있는 GUID와 일치하지 않을 수 있습니다(위의 1, 2번 방법은 이러한 드문 경우에 실제 제품 코드(Windows에 등록되어 있는)를 보고합니다). **MSI 파일을 볼 수 있는 도구가 필요합니다**. 다운로드할 수 있는 무료 도구 목록은 다음 답변 하단을 참조하세요(또는 아래의 빠른 옵션 참조): https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546). **업데이트**: 편의와 **속도 필요** :-), [이 직접 다운로드 핫 링크][5]에서 지체없이 [SuperOrca][4]를 다운로드하십시오 - 도구는 작업을 완료하기에 충분합니다 - 설치, MSI를 열고 [속성 테이블][3]로 바로 이동하여
ProductCode행을 찾으십시오 (** 항상 직접 다운로드 핫 링크를 바이러스 검사하십시오 - 분명히 ** - [virustotal.com][6]을 사용할 수 있습니다 - 수십 개의 안티바이러스 및 멀웨어 제품군을 활용하여 업로드한 내용을 검사하는 온라인 검사). **Orca**는 Microsoft의 자체 도구로, **Visual Studio**와 함께 설치됩니다. Windows SDK**와 함께 설치됩니다. 아래에서 **
Orca-x86_en-us.msi**를 검색해 보세요. 프로그램 파일 (x86)``에서 **
오르카-x86_en.msi``를 검색하고 MSI가 발견되면 설치하세요.업데이트: 업그레이드 코드도 필요한 경우 이 답변을 확인하세요: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095** (관련 제품 코드, 업그레이드 코드 및 제품 이름을 검색합니다. 테이블 출력 - 아래와 유사).
PowerShell을 사용할 수 없나요? 아래의 <대체 도구> 섹션을 참조하세요. 제거하려는 경우 - 아래의 'MSI 패키지 제거' 섹션을 참조하세요. 파워쉘을 실행하고( Windows 키를 누른 상태에서 R을 누른 다음, Windows 키를 놓은 다음,
을 입력하고 확인을 누릅니다 ) 아래 명령을 실행하여 설치된 MSI 패키지 제품 코드 목록과 함께 로컬 캐시 패키지 경로 및 **제품 이름(이름이 잘리지 않도록 파워쉘 창을 최대화하세요) 목록을 가져옵니다. 이 명령줄을 실행하기 전에 아래 고지 사항을 읽어주세요(위험한 내용은 없으며, 몇 가지 잠재적인 문제가 있을 수 있습니다). '대체 도구'의 섹션 3에서는 VBScript를 사용하여 동일한 정보를 얻을 수 있는 WMI가 아닌 대체 방법을 보여줍니다. 패키지를 제거하려는 경우 아래 섹션에 몇 가지 샘플 msiexec.exe 명령줄이 나와 있습니다:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
출력은 다음과 비슷해야 합니다:
참고! 이상한 이유로 WMI*에서 &#제품코드**는 &#식별번호**라고 불립니다. 다시 말해, 위 그림에서 식별 번호는 제품 코드입니다.
많은 원격 컴퓨터에 대해 이 쿼리를 원격으로 실행해야 하는 경우 아래의 <원격 컴퓨터에서 제품 코드 검색> 섹션을 참조하세요.
고지 사항 (중요, 명령을 실행하기 전에 반드시 읽어주세요!): 이상한 Microsoft 설계로 인해 Win32_Product
에 대한 모든 WMI 호출은
(아래 파워셸 명령과 같은)에 대한 모든 WMI 호출은
패키지 자산을 확인합니다. 이 작업은 *매우 느릴 뿐만 아니라 드물게 다음과 같은 문제가 발생할 수 있습니다.
MSI 자체 복구를 트리거할 수 있습니다. 이것은 작은 패키지일 수도 있고
비주얼 스튜디오와 같은 거대한 패키지일 수도 있습니다. 대부분의 경우 이것은 발생하지 않지만
위험이 있습니다. 중요한 회의 직전에 이 명령을 실행하지 마세요.
회의 직전에 이 명령을 실행하지 마세요 - 위험하지는 않지만(읽기 전용입니다), 다음과 같은 경우
매우 드문 경우에 긴 수리로 이어질 수 있습니다 * (나는 당신이 취소 할 수 있다고 생각합니다.
자체 복구 - 해당 패키지에 의해 적극적으로 방지되지 않는 한, Win32_Product를 다시 호출하면 다시 시작됩니다.
를 다시 호출하면 다시 시작되며 이는 자가 복구가 완료될 때까지 지속됩니다(때로는 자가 복구가 완료되더라도 계속될 수 있습니다: https://stackoverflow.com/questions/5501028/how-can-i-determine-what-causes-repeated-windows-installer-self-repair/6066263#6066263).
기록을 위해 말씀드리자면: 일부 사람들은 이벤트 로그가 MsiInstaller EventID 1035 항목으로 채워진다고 보고합니다 (코드 책임자의 답변 참조) - Win32_Product 클래스에 대한 WMI 쿼리로 인해 발생한 것으로 보입니다(개인적으로는 본 적이 없음). 이것은 위에서 제안한 Powershell 명령과 직접적으로 관련이 없으며, WIM 클래스 Win32_Product의 일반적인 사용과 관련이 있습니다. 테이블 대신 목록 형식으로 출력을 가져올 수도 있습니다:
get-wmiobject -class Win32_Product
이론적으로는 명령 자체의 일부로 원격 컴퓨터 이름을 지정할 수 있어야 합니다. 다음은 위와 동일한 명령이 'RemoteMachine' 컴퓨터에서 실행되도록 설정된 예입니다(-ComputerName RemoteMachine
섹션 추가):
get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
적절한 도메인에서 도메인 관리자 권한으로 실행하는 경우 이 방법이 작동할 수 있습니다. 워크그룹 환경(소규모 사무실/홈 네트워크)에서는 WMI 호출에 사용자 자격 증명을 직접 추가해야 작동할 수 있습니다. 또한 WMI의 원격 연결은 (최소한) Windows 방화벽, DCOM 설정 및 사용자 계정 컨트롤(UAC)(그리고 실제 방화벽, 타사 소프트웨어 방화벽, **다양한 종류의 보안 소프트웨어 등 Microsoft 이외의 추가 요소의 영향을 받습니다...)의 영향을 받습니다. 작동 여부는 정확한 설정에 따라 다릅니다.
PowerShell을 사용하려면 .NET 프레임워크가 설치되어 있어야 합니다(현재 3.5.1 버전인 것 같음? 2017년 10월). .NET이 설치되어 있어도 실제 PowerShell 응용 프로그램 자체는 컴퓨터에서 누락 될 수도 있습니다 . 마지막으로 다양한 시스템 정책 및 권한에 의해 PowerShell이 비활성화되거나 잠길 수 있다고 생각합니다. 이 경우 제품 코드를 검색하는 몇 가지 다른 방법을 시도해 볼 수 있습니다. 제가 선호하는 대안은 VBScript**입니다. 빠르고 유연하지만 특정 컴퓨터에서 잠길 수도 있으며 스크립팅은 항상 도구를 사용하는 것보다 약간 더 복잡합니다.
wbemtest.exe
.SELECT IdentifyingNumber,Name,Version FROM Win32_Product
를 클릭하고 사용
을 클릭합니다(또는 이와 동등한 명령 - 도구가 현지화됩니다).WMIExplorer.exe
와 같은 보다 완전한 기능을 갖춘 사용자 지정 WMI 도구를 사용해 볼 수 있습니다.SELECT IdentifyingNumber,Name,Version FROM Win32_Product
를 입력한 후 실행을 누릅니다.msiinfo.csv
입니다.' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")
On Error Resume Next ' we ignore all errors
For Each product In installer.ProductsEx("", "", 7)
productcode = product.ProductCode
name = product.InstallProperty("ProductName")
version=product.InstallProperty("VersionString")
output.writeline (productcode & ", " & name & ", " & version)
Next
output.Close
현재로서는 제품 코드를 검색할 수 있는 더 이상의 범용 옵션이 생각나지 않는데, 알고 계신 것이 있으면 추가해 주세요. 너무 많은 코멘트를 추가하지 말고 인라인 편집만 해주세요.
애플리케이션 내에서 이 정보에 확실히 액세스할 수 있습니다. MSI 자동화 인터페이스]1 (COM 기반) 또는 [C++]를 호출하여 C++ MSI 설치 프로그램 함수 (Win32 API)를 호출하여 액세스 할 수 있습니다. 또는 위의 샘플에서
PowerShell
,wbemtest.exe
또는WMIExplorer.exe
를 사용하는 것처럼 애플리케이션 내에서 WMI 쿼리를 사용할 수도 있습니다.MSI 패키지 제거
제품 코드를 찾은 MSI 패키지를 제거하려면 고급 명령 프롬프트를 사용하여 다음과 같이 할 수 있습니다(cmd.exe 검색, 마우스 오른쪽 클릭 후 관리자 권한으로 실행): 옵션 1: 로깅 없는 기본 대화형 제거(빠르고 간편함):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C}
빠른 매개변수 설명:
/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
원하는 경우 (자세한) 로깅을 활성화하고 자동 모드로 실행하여 옵션 2로 이동할 수도 있습니다: 옵션 2: 상세 로깅과 함께 자동 제거(배치 파일에 더 좋음):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress
빠른 매개변수 설명:
/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
/QN = run completely silently
/L*V "C:\My.log"= verbose logging at specified path
REBOOT=ReallySuppress = avoid unexpected, sudden reboot
C:\WINDOWS\Installer\50c080ae.msi
- 각 시스템마다 고유한 16진수 파일 이름입니다). 그런 다음 '프로퍼티 테이블'에서 업그레이드 코드에 대한 속성 테이블을 찾습니다(변환에서 업그레이드 코드를 재정의할 수 있습니다. 올바른 값을 얻으려면 시스템에서 프로그래밍 방식으로 코드를 검색해야 합니다. 곧 이에 대한 스크립트를 제공하겠습니다). 그러나 캐시된 MSI에서 찾은 UpgradeCode가 일반적으로 정확합니다).
캐시된 MSI 파일을 열려면 Orca 또는 다른 패키징 도구를 사용하세요. 다음은 다양한 도구에 대한 설명입니다(어느 것이든 가능): https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941. 이러한 도구가 설치되어 있지 않은 경우 가장 빠른 방법은 Super Orca를 사용하는 것입니다 (사용하기는 간단하지만 광범위하게 테스트되지는 않았습니다).
업데이트: MSI 파일을 보는 데 사용할 수 있는 다양한 무료 제품에 대한 정보가 포함된 새로운 답변이 있습니다: https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546
Visual Studio가 설치되어 있다면 프로그램 파일(x86)
에서 Orca-x86_en-us.msi
를 검색하여 설치하세요(이것은 Microsoft의 자체 공식 MSI 뷰어 및 편집기입니다). 그런 다음 시작 메뉴에서 Orca를 찾습니다. 곧바로 시작됩니다 :-). 기술적으로 Orca는 Visual Studio가 아닌 Windows SDK의 일부로 설치되지만 Windows SDK는 Visual Studio 설치와 함께 번들로 제공됩니다. Visual Studio가 설치되어 있지 않다면, 설치되어 있는 사람을 알고 계신가요? 이 MSI를 검색하여 보내달라고 부탁하세요(0.5MB의 작은 파일입니다) - 몇 초면 됩니다. 업데이트**: MSI와 함께 여러 개의 CAB 파일이 필요하며, 이 파일은 MSI가 있는 폴더에 있습니다. 그렇지 않은 경우 언제든지 Windows SDK를 다운로드할 수 있습니다(무료이지만 용량이 크며 설치하는 모든 항목이 PC 속도를 느리게 합니다). SDK의 어느 부분이 Orca MSI를 설치하는지 잘 모르겠습니다. 알고 있다면 여기에서 세부 정보를 편집하고 추가하세요.유사한 주제 (참조 및 쉬운 액세스를 위해 -이 목록을 정리해야 함):
설치 프로그램이 너무 많아 원하는 것을 쉽게 찾을 수 없는 경우, 다음은 필터를 제공하고 표시 이름으로 검색 범위를 조금 좁힐 수 있는 몇 가지 파워셸입니다.
$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName