【问题标题】:Launch application after installation complete, with UAC turned on安装完成后启动应用程序,打开 UAC
【发布时间】:2011-01-17 23:38:24
【问题描述】:

美好的一天。

我一直在使用 WIX(Windows Installer XML)技术为我们的产品构建安装程序。如果在安装后选中该复选框,则预期的行为是启动产品。

这已经工作了一段时间,但我们最近发现 Win 7 的 UAC 和 Vista 正在阻止应用程序启动。我做了一些研究,有人建议我添加属性

Execute='deferred' 和 Impersonate='no'。

我这样做了,但后来发现要执行延迟,必须在 InstallInitialize 和 IntallFinalize 阶段之间执行 CustomAction;这不是我需要的。如果选中了启动复选框,我需要在安装完成后启动产品。有没有其他方法可以提升权限?

我们将不胜感激任何和所有的答案、建议或共鸣。

【问题讨论】:

    标签: wix uac wix3 launch


    【解决方案1】:

    WiX 工具集文档有一个名为 How To: Run the Installed Application After Setup 的主题,其中介绍了如何执行此操作。

    【讨论】:

    • 那篇文章没有解决 OP 关于提升权限的问题。
    【解决方案2】:

    不幸的是,Rob 提到的主题对我发现的 Windows Vista 或 7 并没有真正的帮助。尤其是在 UAC 开启的情况下。

    我解决这个问题的方法是使用 CustomAction 来启动命令提示符并启动您想要的应用程序。

    <CustomAction 
        Id="LaunchApp" 
        Directory="YourDirectory" 
        ExeCommand="[SystemFolder]cmd.exe /C app.exe" />
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      请参阅WiX and DTF: Using a bootstrapper to force elevated privileges in Vista 如何提升整个 msi。

      您可以借助 GenerateBootstrapper 任务在 .wixproj 文件中自动执行此操作。总结一下:

      像这样创建一个 setup.manifest:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Setup" type="win32" />
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
          <security>
            <requestedPrivileges>
              <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
          </security>
        </trustInfo>
      </assembly>
      

      然后像这样修改你的 .wixproj 文件:

      <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
       <!-- standard PropertyGroups and ItemGroups -->
      
       <PropertyGroup>
         <WindowsSDK>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows@CurrentInstallFolder)</WindowsSDK>
       </PropertyGroup>
       <PropertyGroup Condition="$(WindowsSDK) == ''">
         <WindowsSDK>$(registry:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\Windows@CurrentInstallFolder)</WindowsSDK>
       </PropertyGroup>
      
       <PropertyGroup>
         <mt_exe>$(WindowsSDK)bin\mt.exe</mt_exe>
       </PropertyGroup>
      
       <ItemGroup>
         <BootstrapperFile Include="Microsoft.Windows.Installer.3.1" >
           <ProductName>Windows Installer 3.1</ProductName>
         </BootstrapperFile>
         <!-- more BootstrapperFile items -->
       </ItemGroup>
      
       <Target Name="Bootstrapper"
               Inputs="$(OutDir)$(TargetFileName)"
               Outputs="$(OutDir)\Setup.exe"
               Condition=" '$(OutputType)'=='package' " >
         <GenerateBootstrapper ApplicationName="application name"
                               ApplicationFile="$(TargetFileName)"
                               BootstrapperItems="@(BootstrapperFile)"
                               ComponentsLocation="Relative"
                               OutputPath="$(OutputPath)"
                               Culture="en-US"
                               Path="$(WindowsSDK)\Bootstrapper" />
       </Target>
      
       <Target Name="PatchSetupExe" DependsOnTargets="Bootstrapper">
         <Exec Command='"$(mt_exe)" -manifest setup.manifest -outputresource:$(OutDir)\Setup.exe;#1' IgnoreExitCode='false' />
       </Target>
      
       <Import Project="$(MSBuildExtensionsPath)\Microsoft\WiX\v3.0\Wix.targets" />
      
       <PropertyGroup>
         <BuildDependsOn>$(BuildDependsOn);Bootstrapper;PatchSetupExe</BuildDependsOn>
       </PropertyGroup>
      </Project>
      

      现在,每次构建都会生成一个正确的 setup.exe,它将在提升后运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-25
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多