Program Tip

설치된 MSI 설정의 제품 GUID를 어떻게 찾을 수 있습니까?

programtip 2020. 12. 15. 19:45
반응형

설치된 MSI 설정의 제품 GUID를 어떻게 찾을 수 있습니까?


나는 찾아야 제품 GUID 에 대한 설치 MSI 파일을 같은 유지 보수를 수행하기 위해 patching, uninstall( 어떻게에 제거 ) 또한 위해 auditing purposes.


대한 업그레이드 코드 검색 : 어떻게이 설치된 MSI 파일에 대한 코드를 업그레이드 찾을 수 있습니까?


짧은 버전

아래 정보는 시간이 지남에 따라 상당히 증가했으며 너무 정교해질 수 있습니다. 제품 코드를 빠르게 얻는 방법은 무엇입니까? (4 가지 접근 방식) :

1. Use the Powershell "one-liner"

스크린 샷과 단계별로 아래로 스크롤합니다 . 또한 아래의 면책 조항-요청하는 사람에 따라 경미하거나 보통의 위험이 있습니다. 나를 위해 잘 작동합니다. 이 옵션에 의해 트리거 된 모든 자가 수리 는 일반적으로 취소 할 수 있습니다. 트리거 패키지 무결성 검사 는 이벤트 로그 "노이즈"를 추가합니다. 참고 ! IdentifyingNumber ProductCode (WMI의 특수성).

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

빠른 파워 쉘의 시작 : 보류 Windows key, 탭 R, "파워 쉘"를 입력하고 키를 누릅니다Enter

2. Use VBScript

아래 " 대체 도구"(섹션 3)에 설명되어 있습니다 . 이 옵션은 아래에 자세히 설명 된 이유로 Powershell보다 안전 할 수 있습니다 . 본질적으로 WMI를 거치지 않기 때문에 (훨씬) 더 빠르고 MSI 자체 복구를 트리거 할 수 없습니다 (매우 빠른 속도MSI COM API에 직접 액세스 ). 그러나 Powershell 옵션 (여러 줄의 코드) 보다 더 복잡합니다 .

삼. Registry Lookup

일부는 레지스트리에서 물건을 찾아서 맹세합니다. 권장하지 않는 접근 방식-적절한 API (또는 OS 함수 호출)를 사용하는 것을 좋아합니다. API 구현의 내부에 의해서만 설명되는 이상한 예외가 항상 있습니다.

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

4. Original MSI File / WiX Source

모든 MSI 파일 (및 기타 속성) Product Code에서 를 찾을 수 있습니다 Property table. 그러나 GUID는 설치시 적용된 변환에 의해 (드물게) 재정의 될 수 있으므로 제품이 등록 된 GUID와 일치하지 않을 수 있습니다 (위의 접근 방식 1 및 2는 Windows에 등록 된 실제 제품 코드를보고합니다. 드문 시나리오).

MSI 파일을 보려면 도구가 필요합니다 . 다운로드 할 수있는 무료 도구 목록은 다음 답변의 하단을 참조하십시오 (또는 아래 빠른 옵션 참조). 두 개 (또는 그 이상의) MSI 파일의 내용을 어떻게 비교할 수 있습니까?

업데이트 : 편의성과 속도를 위해 :-), 이 직접 다운로드 핫 링크 에서 지체없이 SuperOrca다운로드 하십시오.이 도구는 작업을 완료하기에 충분합니다. MSI를 설치하고 열고 속성 테이블 로 바로 이동 하여 ProductCode행 ( 항상 직접 다운로드 핫 링크를 바이러스 검사하십시오.-당연히 virustotal.com사용 하여 수행 할 수 있습니다 -업로드 한 내용을 검사하기 위해 수십 개의 바이러스 백신 및 맬웨어 제품군을 활용하는 온라인 검사).

Orca 는 Microsoft의 자체 도구이며 Visual StudioWindows SDK함께 설치됩니다 . Orca-x86_en-us.msi-아래를 검색 Program Files (x86)하여 MSI를 설치하십시오.


그리고 아래에서 "유기적으로 성장"한 원래의 답변을 찾을 수 있습니다.

어쩌면 "을 참조 제거 MSI 패키지 "이 수행해야하는 작업 인 경우 아래 절을 참조하십시오.


제품 코드 검색

업데이트 : 업그레이드 코드 가 필요한 경우 다음 답변을 확인하십시오 . 설치된 MSI 파일의 업그레이드 코드를 어떻게 찾을 수 있습니까? (아래와 유사한 표 출력에서 ​​관련 제품 코드, 업그레이드 코드 및 제품 이름을 검색합니다.)

  • PowerShell을 사용할 수 없습니까? 아래의 "대체 도구"섹션을 참조하십시오.
  • 제거를 원하십니까? 아래의 "MSI 패키지 제거"섹션을 참조하십시오.

화재 최대 파워 쉘 ( Windows 키 누른 상태에서 탭 R, "파워 쉘"하고 확인을 누릅니다에서 Windows 키 입력을 해제 ) 설치 MSI 패키지의 목록을 얻으려면 아래의 명령을 실행 제품 코드를 과 함께 로컬 캐시 패키지 경로제품 이름 (잘린 이름을 방지하기 위해 PowerShell 창을 최대화).

이 명령 줄을 실행하기 전에 아래의 고지 사항을 읽으십시오 (위험하지 않은 사항, 잠재적 인 성가신 사항). "대체 도구"의 섹션 3에서는 VBScript를 사용하여 동일한 정보를 가져 오는 WMI가 아닌 대체 방법을 보여줍니다. 패키지를 제거하려는 경우 일부 샘플 msiexec.exe 명령 줄이있는 섹션이 아래에 있습니다.

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

출력은 다음과 유사합니다 :

여기에 이미지 설명 입력

노트! 이상한 이유로 "ProductCode"WMI에서 "IdentifyingNumber" 라고합니다 . 즉, 위의 그림에서 IdentifieingNumber ProductCode입니다.

당신이해야하는 경우 원격 컴퓨터의 많은에 대해 원격으로이 쿼리를 실행 본다 " 원격 컴퓨터에서 제품 코드 검색 아래 제".

면책 조항 (중요, 명령을 실행하기 전에 읽으십시오!) : 이상한 Microsoft 설계로 인해 WMI 호출 Win32_Product(아래 PowerShell 명령과 같음)은 패키지 자산유효성 검사를 트리거합니다 . 매우 느린 것 외에도 드물게 MSI 자체 복구가 트리거 될 수 있습니다. 이것은 작은 패키지이거나 Visual Studio와 같은 거대한 것일 수 있습니다. 대부분의 경우 이것은 발생하지 않지만 위험이 있습니다. 중요한 회의 직전에이 명령을 실행하지 마십시오. 위험하지는 않지만 (읽기 전용) 매우 드문 경우 긴 복구로 이어질 수 있습니다.(문제의 패키지에서 적극적으로 방지하지 않는 한 자체 복구도 취소 할 수 있다고 생각합니다. 그러나 Win32_Product를 다시 호출하면 다시 시작되며 자체 복구가 완료 될 때까지 지속됩니다. 완료하도록 두십시오. 반복되는 Windows Installer 자체 복구의 원인을 어떻게 확인할 수 있습니까? ).

그리고 기록을 위해 : 일부 사람들은 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 이외의 추가 요소 (예 : 실제 방화벽 , 타사 소프트웨어 방화벽 , 다양한 보안 소프트웨어 )의 영향을받습니다. 종류 등). 작동 여부는 정확한 설정에 따라 다릅니다.

업데이트 : 원격 WMI 실행에 대한 광범위한 섹션 은 설치된 MSI 파일의 업그레이드 코드를 어떻게 찾을 수 있습니까? . 방화벽 규칙으로 보이며 레지스트리 조정을 통해 UAC 프롬프트를 억제하면 작업 그룹 네트워크 환경에서 작업을 수행 할 수 있습니다. 보안 측면에서 권장되는 변경 사항은 아니지만 저에게 효과적이었습니다.


대체 도구

PowerShell을 사용 하려면 .NET 프레임 워크 를 설치해야합니다 (현재 버전 3.5.1에서는 2017 년 10 월). .NET이 설치된 경우에도 실제 PowerShell 응용 프로그램 자체 시스템에서 누락 될 수 있습니다 . 마지막으로 다양한 시스템 정책 및 권한에 의해 PowerShell을 비활성화하거나 잠글 수 있다고 생각합니다 .

이 경우 제품 코드를 검색하는 몇 가지 다른 방법을 시도 할 수 있습니다. 내가 선호하는 대안은 VBScript 입니다. 빠르고 유연합니다 (하지만 특정 컴퓨터에서 잠글 수도 있고 스크립팅은 항상 도구를 사용하는 것보다 조금 더 복잡합니다).

  1. 로하자 시작합니다 내장 된 윈도우 WMI 도구 : wbemtest.exe.

    • 시작 wbemtest.exe( Windows 키를 누른 상태에서 R을 탭하고 Windows 키를 놓은 다음 "wbemtest.exe"를 입력하고 확인을 누릅니다 ).
    • 연결을 클릭 한 다음 확인 (네임 스페이스 기본값은 root \ cimv2)을 클릭하고 " 연결 "을 다시 클릭 합니다.
    • " 쿼리 "를 클릭 하고이 WQL 명령 (SQL 버전) SELECT IdentifyingNumber,Name,Version FROM Win32_Product을 입력하고 "사용"을 클릭합니다 (또는 동등한 도구가 현지화됩니다).
    • 샘플 출력 스크린 샷 (잘림). 가장 좋은 형식은 아니지만 필요한 데이터를 얻을 수 있습니다. IdentifieingNumber는 MSI 제품 코드입니다 .

wbemtest.exe

  1. 다음으로 WMIExplorer.exe

    • 이것은 Windows에 포함되어 있지 않습니다. 그러나 매우 좋은 도구입니다. 추천합니다.
    • https://github.com/vinaypamnani/wmie2/releases 에서 확인 하세요.
    • 도구를 시작하고 연결을 클릭 한 다음 ROOT \ CIMV2를 두 번 클릭합니다.
    • " 쿼리 탭 "에서 다음 쿼리를 입력 SELECT IdentifyingNumber,Name,Version FROM Win32_Product하고 실행을 누릅니다.
    • 스크린 샷을 건너 뛰었습니다. 애플리케이션에 너무 많은 화면 공간이 필요합니다.
  2. Finally you can try a VBScript to access information via the MSI automation interface (core feature of Windows - it is unrelated to WMI).

    • Copy the below script and paste into a *.vbs file on your desktop, and try to run it by double clicking. Your desktop must be writable for you, or you can use any other writable location.
    • This is not a great VBScript. Terseness has been preferred over error handling and completeness, but it should do the job with minimum complexity.
    • The output file is created in the folder where you run the script from (folder must be writable). The output file is called msiinfo.csv.
    • Double click the file to open in a spreadsheet application, select comma as delimiter on import - OR - just open the file in Notepad or any text viewer.
    • Opening in a spreadsheet will allow advanced sorting features.
    • This script can easily be adapted to show a significant amount of further details about the MSI installation. A demonstration of this can be found here: how to find out which products are installed - newer product are already installed MSI windows.
' 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

I can't think of any further general purpose options to retrieve product codes at the moment, please add if you know of any. Just edit inline rather than adding too many comments please.

You can certainly access this information from within your application by calling the MSI automation interface (COM based) OR the C++ MSI installer functions (Win32 API). Or even use WMI queries from within your application like you do in the samples above using PowerShell, wbemtest.exe or WMIExplorer.exe.


Uninstall MSI Packages

If what you want to do is to uninstall the MSI package you found the product code for, you can do this as follows using an elevated command prompt (search for cmd.exe, right click and run as admin):

Option 1: Basic, interactive uninstall without logging (quick and easy):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C}

Quick Parameter Explanation:

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall

You can also enable (verbose) logging and run in silent mode if you want to, leading us to option 2:

Option 2: Silent uninstall with verbose logging (better for batch files):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress

Quick Parameter Explanation:

/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

There is a comprehensive reference for MSI uninstall here (various different ways to uninstall MSI packages): Uninstalling an MSI file from the command line without using msiexec. There is a plethora of different ways to uninstall.

If you are writing a batch file, please have a look at section 3 in the above, linked answer for a few common and standard uninstall command line variants.

And a quick link to msiexec.exe (command line options) (overview of the command line for msiexec.exe from MSDN). And the Technet version as well.


Retrieving other MSI Properties / Information (f.ex Upgrade Code)

UPDATE: please find a new answer on how to find the upgrade code for installed packages instead of manually looking up the code in MSI files. For installed packages this is much more reliable. If the package is not installed, you still need to look in the MSI file (or the source file used to compile the MSI) to find the upgrade code. Leaving in older section below:

If you want to get the UpgradeCode or other MSI properties, you can open the cached installation MSI for the product from the location specified by "LocalPackage" in the image show above (something like: C:\WINDOWS\Installer\50c080ae.msi - it is a hex file name, unique on each system). Then you look in the "Property table" for UpgradeCode (it is possible for the UpgradeCode to be redefined in a transform - to be sure you get the right value you need to retrieve the code programatically from the system - I will provide a script for this shortly. However, the UpgradeCode found in the cached MSI is generally correct).

To open the cached MSI files, use Orca or another packaging tool. Here is a discussion of different tools (any of them will do): What installation product to use? InstallShield, WiX, Wise, Advanced Installer, etc. If you don't have such a tool installed, your fastest bet might be to try Super Orca (it is simple to use, but not extensively tested by me).

UPDATE: here is a new answer with information on various free products you can use to view MSI files: How can I compare the content of two (or more) MSI files?

If you have Visual Studio installed, try searching for Orca-x86_en-us.msi - under Program Files (x86) - and install it (this is Microsoft's own, official MSI viewer and editor). Then find Orca in the start menu. Go time in no time :-). Technically Orca is installed as part of Windows SDK (not Visual Studio), but Windows SDK is bundled with the Visual Studio install. If you don't have Visual Studio installed, perhaps you know someone who does? Just have them search for this MSI and send you (it is a tiny half mb file) - should take them seconds. UPDATE: you need several CAB files as well as the MSI - these are found in the same folder where the MSI is found. If not, you can always download the Windows SDK (it is free, but it is big - and everything you install will slow down your PC). I am not sure which part of the SDK installs the Orca MSI. If you do, please just edit and add details here.



Similar topics (for reference and easy access - I should clean this list up):


설치 프로그램이 너무 많아 원하는 것을 쉽게 찾을 수없는 경우 여기에 필터를 제공하고 표시 이름별로 범위를 좁힐 수있는 몇 가지 powershell이 ​​있습니다.

$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

참조 URL : https://stackoverflow.com/questions/29937568/how-can-i-find-the-product-guid-of-an-installed-msi-setup

반응형