WiX安装程序:单个程序包创作(每台机器:不安装在程序文件中)

时间:2015-10-19 19:29:03

标签: wix

我有以下为单一包创作编写的Wix XML代码。问题是在UI(WixUI_Advanced)中选择“安装所有机器下”模式时,UI中显示的默认位置是“C:\ Users \ XXXX \ AppData \ Local \ Programs \ MyApp \“。 如何更改此设置,以便默认位置为.. \ Program Files(x86)\ MyApp ....

如果我改变<Property Id="MSIINSTALLPERUSER" Value=" "/>, 然后默认位置是.. \ Program Files(x86)..,但由于缺少管理员权限,每个用户不起作用。

非常感谢。

<Wix    xmlns="http://schemas.microsoft.com/wix/2006/wi"
        xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
        xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">


    <!--Product Information-->
    <Product Id="*"
               Name="$(var.ApplicationName)"
               Language="1033"  Version="!(bind.FileVersion.$(var.ExecutableName))"  Manufacturer="$(var.ManufacturerName)"
               UpgradeCode="33bc2348-****-****-****-ebcde0d14afe">

        <!--MSI Package Information-->
        <Package InstallerVersion="500"
                   Compressed="yes" />


        <!--Single Package Authoring-->
        <Property Id="MSIINSTALLPERUSER" Value="1"/>
        <Property Id="ALLUSERS" Value="2"/>

        <!--Upgrade Information-->
        <MajorUpgrade DowngradeErrorMessage="A newer version of $(var.ApplicationName) is already installed." />

        <MediaTemplate EmbedCab="yes" />

        <!--Application Features-->
        <Feature Id="CoreFeature" Title="$(var.ApplicationName)" Level="1">
              <ComponentGroupRef Id="ProductComponents" />
              <ComponentRef Id="ApplicationShortcut" />
              <ComponentRef Id="RegisterApplicationAutoStart" />
        </Feature>

        <!--Required .NET Framework for the Application-->
        <PropertyRef Id="NETFRAMEWORK35" />
        <Condition Message="This application requires Microsoft .NET Framework 3.5 or greater. Please install the .NET Framework then run this installer again.">
            <![CDATA[Installed OR NETFRAMEWORK35]]>
        </Condition>

        <!--Advanced UI-->
        <Property Id="ApplicationFolderName" Value="$(var.ApplicationName)" />
        <Property Id="WixAppFolder"          Value="WixPerMachineFolder" />

        <UIRef Id="WixUI_Advanced"/>

        <InstallExecuteSequence>
                  <Custom Action="LaunchApplication" After="InstallFinalize">NOT Installed</Custom>     
        </InstallExecuteSequence>

    </Product>


    <Fragment>
        <!-- Define the Target Directory.  The individual files will be filled in via a Heat generated fragment. -->
      <Directory Id="TARGETDIR" Name="SourceDir">
        <!--Define the directory when the application will be installed-->
          <Directory Id="ProgramFilesFolder">
                <Directory Id="APPLICATIONFOLDER" Name="$(var.ApplicationName)" />
          </Directory>
    </Fragment>


    <Fragment>
        <Component Id="RegisterApplicationAutoStart" Directory="ApplicationProgramsFolder" Guid="*">
            <RegistryValue Root="HKMU"
                             Key="Software\Microsoft\Windows\CurrentVersion\Run"
                             Name="$(var.ApplicationName)"
                             Type="string"
                             Value="[APPLICATIONFOLDER]$(var.ExecutableName)"
                             KeyPath="yes" />
        </Component>
    </Fragment>

</Wix>

4 个答案:

答案 0 :(得分:1)

请点击以下链接 http://wixtoolset.org/documentation/manual/v3/wixui/dialog_reference/wixui_advanced.html

对于每台计算机的安装,默认安装位置为

[ProgramFilesFolder][ApplicationFolderName] 

用户可以在设置界面中更改它。

对于每用户安装,默认安装位置为

[LocalAppDataFolder]Apps[ApplicationFolderName] 

用户将在设置界面中无法更改

您可以将每个用户设置为0以强制每台计算机安装 - 或在程序文件

<WixVariable Id="WixUISupportPerUser" Value="0" />

对于每台机器安装,您将需要管理员权限,如果用户没有管理员权限,他只能访问其本地应用程序数据文件夹,因此无法更改该位置。

答案 1 :(得分:1)

如果要安装到Program Files文件夹,则需要您是管理员。受限用户无法在该文件夹中创建或更新文件,并且运行MSI安装不会因为安装而破坏安全性。所以答案是你不能安装到ProgramFiles,除非你让MSI要求提升权限。您的问题基本上是&#34;有限的用户如何通过添加或替换Program Files文件夹中的文件来破坏安全性,并且没有办法回答这个问题。

您的应用是否需要提升权限才能运行?它有海拔清单吗?如果答案是肯定的,那么我怀疑你是否仍然需要提升安装权限。

答案 2 :(得分:1)

我在WiX安装程序中包含以下行修复了我的问题。

int solution, num1, num2;

对于每台计算机的安装,这会将设置为C:\ Users \ XXX \ AppData \ Local .....的ProgramFilesFolder的值更改为C:\ Program Files(x86)。

此外,上述代码行对每个用户的安装没有任何影响,安装仅在该用户文件夹中进行(根据需要)。

答案 3 :(得分:1)

OP完美地描述了它。通过以下方式启用单一创作,似乎无法在ProgramFilesFolder获取“实际”C:\Program Files (x86)\

<Package InstallerVersion="200" ... /> <!-- do not specify InstallScope or InstallPrivileges! -->
<Property Id="ALLUSERS" Value="2" />
<Property Id="MSIINSTALLPERUSER" Value="1" />

即使MSIINSTALLPERUSER被重置,也不会更改ProgramFilesFolder的值,它仍然是C:\Users\XXX\AppData\Local\Programs(我假设在安装程序启动时通过SHGetFolderPath初始化文件夹,并且此后不会改变)。

在他的回答中明确地设置ProgramFilesFolder就像他的回答一样,我猜,但这是一个丑陋的黑客。最终对我有用的是从'perMachine'模式开始:

<Property Id="ALLUSERS" Value="2" />
<Property Id="MSIINSTALLPERUSER" />

之后,如果安装者选择'perUser'模式,我会相应地设置变量:

<Publish Dialog="MyWelcomeDlg" Control="Next" Property="MSIINSTALLPERUSER" Value="1">1</Publish>
<Publish Dialog="MyWelcomeDlg" Control="Next" Property="ALLUSERS" Value="{}">1</Publish>

这样,文件夹将被正确设置。

我认为潜在的问题是ProgramFilesFolder永远设置为AppData中的内容,这几乎没有任何意义。