2011-12-23 4 views
0

설치된 제품을 식별하는 GUID를 부여하면 C#으로 해당 제품에 설치된 패치를 찾을 수 있습니까?패치 정보에 액세스 하시겠습니까?

응용 프로그램은 상당히 복잡하며 때로는 Orca/MSI를 통해 패치 (MSP 파일)를 만듭니다. 그런 다음이 패치를 고객의 컴퓨터에 설치할 수 있으며 "프로그램 및 기능"의 "설치된 업데이트보기"에서 볼 수 있습니다. 내가 Win32_Product와 나의 제품을 찾을 거기 정보를 검색 할 수 있습니다 WMI를 사용하여

  1. :

    나는 두 가지 방법을 시도했습니다. 그러나 Win32_PatchPackage 또는 Win32_Patch를 쿼리하여 "ProductCode"에 대한 일치 항목을 쿼리하면 내가 원하는 정보가 포함 된 캡쳐/설명 에 대한 정보가 포함되어있을 것이라고 기대했지만, 각각의 정보는 매우 명확한 것으로 보이지 않는 GUID 세트가 각각 별도의 집합입니다. .

  2. 마찬가지로, 레지스트리 내가 HKLM \ 소프트웨어 \ 마이크로 소프트 \ 제거 \\ 아래 (제품을 찾을 수 뒷조사와 내가 패치를 찾을 수를 사용하여 ( HKLM \ 소프트웨어 \ 마이크로 소프트 \ 설치에서 \ UserData를 \ S-1-5-18 \ 제품 \) 하지만 키가 명확하지 않다. 그것은 설치 GUID 내 제품과 동일하지 않습니다.

This question 유사한 문제에 대해 설명하지만, 질문자는보고 있었다 Windows 패치는 내 응용 프로그램 패치가 필요하지만 실제로는 저에게 해결책이 없습니다.

미리 감사드립니다.

답변

0

Win32_PatchPackage에서 반환 된 ProductCode를 Win32 dll에 연결 한 다음 사용하여이 작업을 수행 할 수있었습니다.

[DllImport("msi.dll", CharSet = CharSet.Unicode)] 
    internal static extern Int32 MsiGetPatchInfoEx(string szPatchCode, string szProductCode, string szUserSid, int dwContext, string szProperty, [Out] StringBuilder lpValue, ref Int32 pcchValue); 

    // See http://msdn.microsoft.com/en-us/library/windows/desktop/aa370128%28v=vs.85%29.aspx 
    // for valid values for the property paramater 
    private static string getPatchInfoProperty(string patchCode, string productCode, string property) 
    { 
     StringBuilder output = new StringBuilder(512); 
     int len = 512; 
     MsiGetPatchInfoEx(patchCode, productCode, null, 4, property, output, ref len); 
     return output.ToString(); 
    } 

    public static string GetPatchDisplayName(string patchCode, string productCode) 
    { 
     return getPatchInfoProperty(patchCode, productCode, "DisplayName"); 
    } 
관련 문제