10

再会。

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

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

执行='延迟'和模拟='否'。

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

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

4

3 回答 3

5

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

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

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

希望有帮助。

射线

于 2010-05-07T10:36:01.823 回答
3

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

于 2010-05-01T21:51:37.370 回答
2

请参阅WiX 和 DTF:在 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,它将在提升后运行。

于 2010-07-22T20:18:25.423 回答