从WIX Bundle读取注册表,该注册表仅具有管理员权限

时间:2014-05-12 19:04:48

标签: wix

我有非常奇怪的情况需要处理。

我们有一个基于WIX的MSI安装程序。现在我们想引导这个MSI,所以我打算使用WIX Burn。直到现在一切正常。但是当我尝试从旧版本的MSI升级到最新的WIX Bundle时,我遇到了一个问题。

WIX包很好地检测升级但我想读取旧版MSI创建的注册表项。较旧的MSI创建的注册表项仅具有Administrator的权限。读取注册表项是非常重要的,因为我的UI取决于我升级表单的版本。我知道在Engine.Detect回调期间,我将了解以前安装的版本。但我需要找到一些配置文件位置,我只能通过阅读注册表来完成。此外,即使我可以获取配置文件位置,在中等完整性下运行的捆绑包也可能没有读取文件的权限。那么有没有办法可以提升Bundle.exe的执行力

1 个答案:

答案 0 :(得分:0)

这是迟到的回答。我找到了一个能帮我完成工作的黑客。

  • 我在清单中使用Invoker = Admin创建了一个可执行文件。假设可执行文件是RegistryACLUpdater.exe。
  • RegistryACLUpdater将更改require注册表项的ACL,以向Authenticated用户提供读取权限。
  • 我将可执行文件捆绑在WIX包中
    <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost">
       <Payload SourceFile="$(var.exe_loc)\RegistryACLUpdater.exe"/>
    </BootstrapperApplicationRef>
  • 然后我使用Verb =&#34; runas&#34;执行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
    };