WIx "Запомни шаблон свойств", не позволяющий свойствам быть доступными в пользовательских действиях

Я использую Wix версии 3.9R2

Я следовал приведенным здесь советам, чтобы создать постоянные свойства при установке / ремонте / удалении моего продукта.

При установке свойства, установленные из командной строки, корректно отправляются в мой метод настраиваемых действий. Когда я переустанавливаю продукт, они этого не делают, хотя журнал показывает, что свойства заполнены правильными значениями. Вот мои журналы установки (как установка, так и восстановление).

Кроме того, вот мой файл WXS. Я опустил некоторые части, которые я не считаю актуальными.

<?xml version="1.0" encoding="UTF-8"?>
<Wix>
  <Product>

    <!--These are all of our properties that we can configure-->
    <Property Id="APPPOOLUSERACCOUNTTYPE" Value="networkService" />
    <Property Id="APPPOOLUSERNAME" Value="Username" />
    <Property Id="APPPOOLUSERPASSWORD" Value="Password" />
    <Property Id="DATABASECONNECTIONSTRING">
      <RegistrySearch Id="DatabaseConnectionStringProperty" Root="HKLM"
                      Key="SOFTWARE\MedXStorage\Database"
                      Name="ConnectionString" Type="raw" />
    </Property>
    <Property Id="DATABASENAME">
      <RegistrySearch Id="DatabaseNameProperty" Root="HKLM"
                      Key="SOFTWARE\MedXStorage\Database"
                      Name="DatabaseName" Type="raw" />
    </Property>

    <!--Actions to restore any settings set from the command line-->
    <CustomAction Id="DATABASECONNECTIONSTRING_SaveCmdLineValue" Property="CMDLINE_DATABASECONNECTIONSTRING" Value="[DATABASECONNECTIONSTRING]" Execute="firstSequence" />
    <CustomAction Id="DATABASECONNECTIONSTRING_SetFromCmdLineValue" Property="DATABASECONNECTIONSTRING" Value="[CMDLINE_DATABASECONNECTIONSTRING]" Execute="firstSequence" />
    <CustomAction Id="DATABASENAME_SaveCmdLineValue" Property="CMDLINE_DATABASENAME" Value="[DATABASENAME]" Execute="firstSequence" />
    <CustomAction Id="DATABASENAME_SetFromCmdLineValue" Property="DATABASENAME" Value="[CMDLINE_DATABASENAME]" Execute="firstSequence" />

    <!--Action that deploys the database-->
    <CustomAction Id="DeployDatabaseAction"
               BinaryKey="MedXStorage.InstallerActions.dll"
               DllEntry="DeployDatabase" />

    <InstallExecuteSequence>
      <!--Restore and settings set from the command line-->
      <Custom Action="DATABASECONNECTIONSTRING_SaveCmdLineValue" Before="AppSearch" />
      <Custom Action="DATABASECONNECTIONSTRING_SetFromCmdLineValue" After="AppSearch">CMDLINE_DATABASECONNECTIONSTRING</Custom>
      <Custom Action="DATABASENAME_SaveCmdLineValue" Before="AppSearch" />
      <Custom Action="DATABASENAME_SetFromCmdLineValue" After="AppSearch">CMDLINE_DATABASENAME</Custom>
      <!--Lets try to deploy our datbase-->
      <Custom Action="DeployDatabaseAction" After="InstallInitialize">
        <![CDATA[&DatabaseFeature=3 OR REINSTALL><DatabaseFeature]]>
      </Custom>
    </InstallExecuteSequence>

    <InstallUISequence>
      <!--Restore and settings set from the command line-->
      <Custom Action="DATABASECONNECTIONSTRING_SaveCmdLineValue" Before="AppSearch" />
      <Custom Action="DATABASECONNECTIONSTRING_SetFromCmdLineValue" After="AppSearch">CMDLINE_DATABASECONNECTIONSTRING</Custom>
      <Custom Action="DATABASENAME_SaveCmdLineValue" Before="AppSearch" />
      <Custom Action="DATABASENAME_SetFromCmdLineValue" After="AppSearch">CMDLINE_DATABASENAME</Custom>
    </InstallUISequence>

  </Product>
</Wix>

Вот мой метод действия C#.

[CustomAction]
public static ActionResult DeployDatabase(Session session)
{
    try
    {
        session.Log("Begin DeployDatabase");

        var connectionString = session["DATABASECONNECTIONSTRING"];
        var databaseName = session["DATABASENAME"];
        var dacpacLocation = session["DATABASEDACPACLOCATION"];

        session.Log("Starting database deploy with...");
        session.Log("   ConnectionString=" + connectionString);
        session.Log("   DatabaseName=" + databaseName);
        session.Log("   DacpacLocation=" + dacpacLocation);

        if (string.IsNullOrEmpty(connectionString))
        {
            session.Log("Connection string must be provided.");
            return ActionResult.Failure;
        }

        if (string.IsNullOrEmpty(connectionString))
        {
            session.Log("Database name must be provided.");
            return ActionResult.Failure;
        }

        if (string.IsNullOrEmpty(dacpacLocation))
        {
            session.Log("Dacpac must be provided.");
            return ActionResult.Failure;
        }

        if (!File.Exists(dacpacLocation))
        {
            session.Log("The dacpac doesn't exist at " + dacpacLocation + ".");
            return ActionResult.Failure;
        }

        SqlPackage.Deploy(dacpacLocation, connectionString, databaseName, (messageType, message) => session.Log("Sql deploy message: " + messageType + ": " + message));

        return ActionResult.Success;
    }
    catch (Exception ex)
    {
        session.Log("Error deploying database.");
        var exception = ex;
        while (exception != null)
        {
            session.Log("---");
            session.Log("Message:" + exception.Message);
            session.Log("Stacktrace:" + exception.StackTrace);
            session.Log("---");
            exception = exception.InnerException;
        }
        return ActionResult.Failure;
    }
}

В журналах восстановления вы можете видеть, что он правильно настраивает свойства.

Property(C): DATABASECONNECTIONSTRING = Data Source=(localdb)\ProjectsV12;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False

Однако в моем настраиваемом действии я не могу получить это свойство.

Starting database deploy with...
   ConnectionString=
   DatabaseName=
   DacpacLocation=C:\Users\Paul\AppData\Local\Temp\tmpA791.tmp

Почему эта же MSI дает мне правильные значения свойств во время установки, но не при ремонте?

2 ответа

Решение

WiX использует атрибут Secure в элементе Property для создания свойства SecureCustomProperties.

SecureCustomProperties - это список открытых свойств, разделенных точками с запятой. Эти свойства включены в список по умолчанию ограниченных общедоступных свойств, которые установщик может передать на серверную часть при выполнении управляемой установки с повышенными привилегиями.

FWIW, структура помни меня свойства является неполной, на мой взгляд. Обычно я также использую шаблон приоритета источника свойства. Идея состоит в том, что значение, переданное в командной строке или выбранное в пользовательском интерфейсе, должно переопределить запомненное значение, которое должно переопределить значение по умолчанию.

Свойства должны быть помечены как "Secure=:yes", если они должны быть перенесены из последовательности пользовательского интерфейса в последовательность выполнения сервера - это может быть проблемой.

Другие вопросы по тегам