2014-05-12 3 views
2

처리해야 할 이상한 시나리오가 있습니다.관리자 만 허용하는 WIX 번들에서 레지스트리 읽기

우리는 WIX 기반의 MSI 설치 프로그램이 있습니다. 이제 우리는이 MSI를 부트 스트랩하여 WIX Burn을 사용할 계획입니다. 지금까지 모든 것이 잘 작동합니다. MSI의 이전 버전에서 최신 WIX 번들로 업그레이드하려고 할 때 문제가 발생했습니다.

WIX 번들은 업그레이드를 멋지게 감지하지만 이전 MSI에서 만든 레지스트리 항목을 읽고 싶습니다. 이전 MSI에서 만든 레지스트리 항목에는 Administrator에 대한 권한 만 있습니다. 내 UI가 어떤 버전의 양식을 업그레이드하는지에 따라 레지스트리 항목을 읽는 것이 매우 중요합니다. Engine.Detect Callback 중에 내가 이전에 설치 한 버전을 알게 될 것입니다. 하지만 필자는 레지스트리를 읽음으로써 내가 할 수있는 설정 파일 위치를 찾아야한다. 또한 설정 파일 위치를 얻을 수있는 경우에도 매체 무결성 하에서 실행되는 번들에는 파일을 읽을 수있는 권한이 없을 수 있습니다. 그래서 Bundle.exe의 실행을 향상시킬 수있는 방법이 있습니다.

+0

코드를 표시 할 수 있습니까? – Gilad

답변

0

이것은 늦은 답변입니다. 나는 나를 위해 일한 해킹을 알아 냈다.

  • 매니페스트에 Invoker = Admin과 함께 실행 파일을 만들었습니다. 실행 파일이 RegistryACLUpdater.exe라고 가정 해 보겠습니다.
  • RegistryACLUpdater는 인증 된 사용자에게 읽기 권한을 제공하기 위해 require 레지스트리 항목의 ACL을 변경합니다.
  • 난 윅스의 실행이
 
    <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost"> 
     <Payload SourceFile="$(var.exe_loc)\RegistryACLUpdater.exe"/> 
    </BootstrapperApplicationRef> 
  • 그럼 I이 상승 모드로 실행하는 동사 = "RUNAS"를 사용하여 실행 EXE 번들 번들.


    string RegistryAclUpdater = "RegistryACLUpdater.exe"; 
    string path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), RegistryAclUpdater); 
    var processStartInfo = new ProcessStartInfo() 
    { 
     FileName = path, 
     CreateNoWindow = true, 
     UseShellExecute = true, 
     RedirectStandardError = false, 
     Arguments = arguments, 
     Verb = "runas" //To execute in elevated mode. 
    }; 

    var registryPermissionUpdater = new Process() 
    { 
     StartInfo = processStartInfo 
    }; 

관련 문제