Как установить права доступа к подпапкам ProgramFilesFolder в Wix?

Я устанавливаю приложение в папку Program Files с помощью WiX. Я использую util: XmlFile для обновления элемента connectionStrings, но получаю сообщение об ошибке «Не удалось открыть файл XML C: \ Program Files (x86) \ developmentMENTALmadness \ MainApp.exe.config, системная ошибка -2147024786». Я пытаюсь повысить разрешения и установить разрешения для целевого файла и родительской папки, но разрешения не устанавливаются.

Product.wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="{7A04DDDD-F423-4E81-A42F-6831479ECF15}" Name="Installer" 
             Language="1033" Version="1.0.0.0" 
             Manufacturer="developMENTALmadness" 
             UpgradeCode="a65f51b5-8bf8-4490-8fab-899cc23a8e1b">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" 
                     InstallPrivileges="elevated" />

  <MajorUpgrade DowngradeErrorMessage="A newer version is already installed." />
    <MediaTemplate EmbedCab="yes" />

    <Property Id="SQLSERVER" Value="(local)" />
    <Property Id="SQLDATABASE" Value="OMDatabase" />
    <Property Id="SQLINSTALLUSER" Value="sa" />
    <Property Id="SQLINSTALLPWD" />
    <Property Id="SQLUSER" />
    <Property Id="SQLPWD" />

    <Feature Id="ProductFeature" Title="Installer" Level="1">
        <ComponentGroupRef Id="main_output"/>
    </Feature>

    <!--<UIRef Id="WixUI_Minimal"/>-->
    <UIRef Id="CustomWizard"/>

     <Binary Id="WixUI_Bmp_Banner" 
                 SourceFile="$(var.MainApp.ProjectDir)info.png" />
     <Binary Id="WixUI_Ico_Info" 
                 SourceFile="$(var.MainApp.ProjectDir)favicon.ico"/>
</Product>

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="developMENTALmadness">
                <Directory Id="target_root" Name="HelloWiX" >
                </Directory>
            </Directory>
        </Directory>
    </Directory>
</Fragment>

I've generated the component list by using heat.exe and modified it (MainOutput.wxs):

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
    <DirectoryRef Id="target_root">
        <Component Id="root_permissions" Guid="{87E634CC-8F0E-4610-961A-9B6C1BBDAEFE}">
            <CreateFolder Directory="target_root">
                <util:PermissionEx User="Users" GenericAll="yes" ChangePermission="yes" />
            </CreateFolder>
        </Component>
    </DirectoryRef>
</Fragment>
<Fragment>
    <ComponentGroup Id="main_output">
        <Component Id="cmp2D913B775A49E24FBD0E4DB1A96F05A7" Directory="target_root" Guid="{6284BD47-6181-4220-8DF8-D76F43A608F4}">
            <File Id="fil115E0DBDE48A315B4A1DABD091FE0184" KeyPath="yes" Source="$(var.MainApp.TargetPath)" />
        </Component>
        <Component Id="cmp1A2EDC339002636FAD729B028E1D726A" Directory="target_root" Guid="{45D6B30C-4C74-4260-B53F-855E5F4681FA}">
            <File Id="filB9D96E3BAC71662F051EA888708285DA" KeyPath="yes" Source="$(var.MainApp.TargetPath).config" Vital="yes">
                <util:PermissionEx User="Users" GenericAll="yes" ChangePermission="yes" />
            </File>
            <util:XmlFile Id="SetSqlConnection" Action="setValue" 
                          ElementPath="/configuration/connectionStrings/add[\[]@name='database'[\]]"
                          File="[INSTALLFOLDER]$(var.MainApp.TargetFileName).config"
                          Value="Server=[SQLSERVER];Database=[SQLDATABASE];uid=[SQLUSER];pwd=[SQLPWD];" 
                          Sequence="1"
                          SelectionLanguage="XPath" Name="connectionString"  />
        </Component>
    </ComponentGroup>
</Fragment>


person Mark J Miller    schedule 05.08.2014    source источник


Ответы (2)


Вы можете попробовать элемент PermissionEx.

Некоторые похожие вопросы:

person Stein Åsmul    schedule 05.08.2014
comment
Я использую PermissionEx. Вот что так расстраивает, похоже, это не работает. Если я не использую его неправильно, было бы здорово, если бы кто-нибудь мог указать на то, что я делаю неправильно. - person Mark J Miller; 06.08.2014
comment
ладно, вы имели в виду элемент PermissionEx в MSI 5.0. Я должен был перейти по ссылке (честно говоря, они не должны были повторно использовать имя). Можете ли вы предоставить аналогичный пример, основанный на моем примере выше? Я видел все эти сообщения до того, как попытался опубликовать себя. - person Mark J Miller; 06.08.2014

Хорошо, может показаться, что лучше (рекомендуется?) Хранить мой файл конфигурации в CommonAppDataFolder (C: \ ProgramData). Это означает, что мне нужно использовать метод ConfigurationManager.OpenMappedExeConfiguration, чтобы загрузить мою конфигурацию сейчас, например:

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = Path.Combine(@"C:\ProgramData\developMENTALmadness", 
    Path.GetFileName(Assembly.GetExecutingAssembly().Location) + ".config");

var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

var name = config.AppSettings.Settings["FullName"].Value;

И гораздо более упрощенная версия того, что я пытаюсь сделать, такова:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="{F15C9D98-5296-417C-847F-1DC1E67C3498}" Name="HelloWiXInstaller" Manufacturer="developMENTALmadness" Language="1033" Version="1.0.0.0" UpgradeCode="a3be08fb-680d-425a-a471-4ab16e4aa805">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MediaTemplate EmbedCab="yes" />

    <Property Id="FULL_NAME" Value="Mark J. Miller (installed)" />

    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="developMENTALmadness">
                <Component Id="CMP_HelloWiX.exe" Guid="{38FC6E96-37D6-4A2D-A584-F7D84705AC34}">
                    <File Id="EXE_HelloWiX.exe" Source="$(var.HelloWiX.TargetPath)" />
                </Component>
            </Directory>
        </Directory>
        <Directory Id="CommonAppDataFolder">
            <Directory Id="CONFIGFOLDER" Name="developMENTALmadness">
                <Component Id="CMP_HelloWiX.exe.config" Guid="{6D470FDB-BF36-4648-BDBD-63D168F8D085}">
                    <File Id="CONFIG_HelloWiX.exe.config" Source="$(var.HelloWiX.TargetPath).config" />
                    <util:XmlFile Id="SetConfigValue" Action="setValue"
                                  File="[CONFIGFOLDER]$(var.HelloWiX.TargetFileName).config"
                                  ElementPath="/configuration/appSettings/add[\[]@key='FullName'[\]]"
                                  Value="[FULL_NAME]"
                                  SelectionLanguage="XPath"
                                  Name="value"/>
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id="HelloWiXProduct" Title="Hello, WiX" Level="1">
        <ComponentRef Id="CMP_HelloWiX.exe" />
        <ComponentRef Id="CMP_HelloWiX.exe.config" />
    </Feature>
</Product>

And that works without any issues, so unless someone knows how to fix the other problem I'll go with this solution.

Вот ссылка на полный источник этого образца на github: https://github.com/developmentalmadness/HelloWiX

person Mark J Miller    schedule 06.08.2014