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

3
我有以下的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个回答

2

楼主已经描述得非常完美了。使用以下方式启用单一作者,似乎没有办法获取到位于C:\ Program Files(x86)\的“实际”ProgramFilesFolder

<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初始化的,并在此后不会更改)。
像OP在答案中展示的明确设置ProgramFilesFolder可能会起作用,但这是一种丑陋的hack。最终对我有用的是从“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中的某些内容,这几乎没有任何意义。


1
如果您想安装到Program Files文件夹,则需要成为管理员。受限用户无法在该文件夹中创建或更新文件,运行MSI安装程序并不会因为它是一个安装程序而破坏安全性。因此,答案是除非您导致MSI请求提升的特权,否则无法安装到ProgramFiles。您的问题本质上是“受限用户如何通过添加或替换Program Files文件夹中的文件来破坏安全性”,而没有办法回答这个问题。
您的应用程序是否需要提升权限才能运行?它是否有提升清单?如果答案是肯定的,那么我怀疑您必须满足安装所需的提升权限要求。

我是在安装此应用程序的机器上的管理员。我的应用程序不需要提升权限即可运行,并且没有提升清单。当 <Property Id="MSIINSTALLPERUSER" Value=" "/> 时,它会安装到 C:\Program Files (x86),但无法进行用户安装。当 <Property Id="MSIINSTALLPERUSER" Value="1"/> 时,它会安装到 C:\Users\XXXX\AppData\Local\Programs\MyApp\,并且可以成功进行用户安装。当我查看安装程序的日志文件时,我发现 APPLICATIONFOLDER 的值会根据上述描述而初始化为不同的值。 - Gautam T Goudar

1
我在WiX安装程序中包含了以下行,解决了我的问题。
 <SetDirectory Id="ProgramFilesFolder" Value="C:\Program Files (x86)\"></SetDirectory>

这改变了被设置为C:\Users\XXX\AppData\Local...的ProgramFilesFolder的值,以便进行适用于每台计算机的安装,而不是适用于每个用户的安装。同时,上述代码行对于适用于每个用户的安装没有任何影响,安装仅在该用户文件夹中发生(按预期)。

0
请点击下面的链接: http://wixtoolset.org/documentation/manual/v3/wixui/dialog_reference/wixui_advanced.html 对于每台机器安装, 默认的安装位置将会是:
[ProgramFilesFolder][ApplicationFolderName] 

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

对于每个用户的安装, 默认的安装位置将是

[LocalAppDataFolder]Apps[ApplicationFolderName] 

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

您可以将每个用户设置为0,以强制执行每台机器或在程序文件中安装。

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

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


我的问题是,每台机器的安装没有发生在[[ProgramFilesFolder][ApplicationFolderName],而是发生在... - Gautam T Goudar
2
感谢回复。我的问题是,每台机器的安装没有发生在[ProgramFilesFolder] [ApplicationFolderName]上,而是发生在C:\ Users <UserName> \ AppData \ Local \ Programs上。我无法弄清楚为什么会更改此默认路径。用户可以更改此路径,但如果他没有更改,则会在上述文件夹中安装,并且其他标准用户无法访问它。 - Gautam T Goudar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接