Именованный экземпляр SQL Server с проектом установщика Visual Studio 2017

Программного обеспечения:

  1. SQL Server Express 2016
  2. Visual Studio 2017

Мы безуспешно пытались установить именованный экземпляр SQL Server Express 2016 как часть проекта установки VS Installer.

Мы пробовали звонить InstallNamedInstance() следующим образом с данными результатами:

  1. Бежать SQLEXPR_x64_ENU.exe с теми же аргументами командной строки из окна cmd администратора: Успешно
  2. Вызов InstallNamedInstance() из консольного приложения и запустите консольное приложение из окна cmd администратора: Успешно
  3. Установить пользовательское действие ("Все и только я"): не работает
  4. Событие BeforeInstall (как для всех, так и для меня): ошибка

Я заметил, что текущий пользователь при запуске MSI NT AUTHORITY\SYSTEM, Всякий раз, когда это терпит неудачу из проекта Установщика, это терпит неудачу с сообщением ниже:

Учетная запись, на которой выполняется программа установки SQL Server, не имеет одного или всех из следующих прав: право на резервное копирование файлов и каталогов, право на управление аудитом и журнал безопасности, а также право на отладку программ. Чтобы продолжить, используйте учетную запись с обоими этими правами. Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/ms813696.aspx, http://msdn.microsoft.com/en-us/library/ms813959.aspx и http://msdn.microsoft.com/en-us/library/ms813847.aspx.

Это ограничение проекта Installer или я что-то упустил? Нам повезет больше с AdvancedInstaller?

Обратите внимание, что предварительное условие для Installer Project не работает для нас, потому что нам нужно создать именованный экземпляр SQL Server Express, и мы не можем увидеть, как мы можем передать аргументы командной строки в предварительные условия.

private void InstallNamedInstance()
{
    // NOTE: Change below instance name to get unique instances (or uninstall previous instance)
    var InstanceName = "TFPICDATABASES2";
    var proc = new Process();
    // NOTE:
    //  1. Download "SQLServer2016-SSEI-Expr.exe" web installer from https://www.microsoft.com/en-us/download/details.aspx?id=54284
    //  2. Run the web installer and choose 3rd option "Download Media". This will give "SQLEXPR_x64_ENU.exe"
    proc.StartInfo.FileName = @"c:\temp\sql\SQLEXPR_x64_ENU.exe ";
    proc.StartInfo.Arguments = " /Action=Install";
    proc.StartInfo.Arguments += $" /INSTANCEID={InstanceName}";
    proc.StartInfo.Arguments += $" /InstanceName={InstanceName}";
    proc.StartInfo.Arguments += " /ROLE=AllFeatures_WithDefaults";
    proc.StartInfo.Arguments += " /QS";
    proc.StartInfo.Arguments += " /INDICATEPROGRESS=True";
    proc.StartInfo.Arguments += " /IAcceptSQLServerLicenseTerms=True";
    proc.StartInfo.WorkingDirectory = @"c:\temp\sql";

    WriteLog($"FielName: {proc.StartInfo.FileName}; Arguments: {proc.StartInfo.Arguments}; WorkingDir: {proc.StartInfo.WorkingDirectory}");

    proc.StartInfo.UseShellExecute = false;
    proc.OutputDataReceived += (s, e) => WriteLog($"Info: {e.Data}");
    proc.ErrorDataReceived += (s, e) => WriteLog($"Error: {e.Data}");

    var ok = proc.Start();
    // NOTE: Log files are in C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\Log
    // Summary.txt gives log of latest installer run. It also creates one folder for each installer attempt
    // and gathers more detailed logs in those folders.
    proc.WaitForExit();
    WriteLog($"{proc.StartInfo.FileName} exited with {proc.ExitCode}");
    if (proc.ExitCode != 0)
    {
        throw new Exception($"SQL Server Express installation failed. Check log file for more details");
    }
}

2 ответа

Решение

Я подозреваю, что ваше пользовательское действие не выполняется под учетной записью SYSTEM из-за ошибок, упомянутых в этих статьях:

В Advanced Installer настраиваемое действие, устанавливающее сервер SQL, не запускается под системной учетной записью, оно запускается под учетной записью, с которой началась установка (которая должна иметь учетные данные администратора). Настраиваемое действие (выделенная программа запуска exe, входящая в комплект Advanced Installer) настроено так, чтобы требовать повышения прав администратора (что, я подозреваю, нельзя настроить в VS), поэтому процесс установки для SQL-сервера выполняется с повышенными правами с использованием учетной записи обычного пользователя с компьютера, а не NT SYSTEM.

Резюме: По сути, нижеуказанные состояния: 1) Отключите настраиваемое действие для запуска SQL Server setup.exe в вашем текущем MSI. 2) Создать базовый WiX Burn Bundle запустить SQL Server setup.exe сначала, а затем запустите созданный вами проект установщика Visual Studio MSI после этого. Или еще лучше, сделайте весь MSI в WiX также. Коммерческие инструменты, такие как Advanced Installer и Installshield, являются жизнеспособными вариантами - они имеют встроенную поддержку для этого (функции могут отличаться в зависимости от версии обязательного компонента).

Burn Bundle-Mockup ( вдохновение, больше вдохновения):

Просто чтобы показать, как работает разметка записи WiX:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <Bundle Name="MyCoolTestApp" Version="1.0.0.0" 
          Manufacturer="Someone" UpgradeCode="PUT-GUID-HERE">

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />

    <util:FileSearch Path="[WindowsFolder]System32\ucrtbase.dll" Variable="VCDISTINSTALLED"/>

    <Chain>

      <ExePackage SourceFile="vc_redist.x64.exe"
                  DetectCondition="VCDISTINSTALLED"
                  InstallCommand="/q /ACTION=Install"
                  RepairCommand="/q ACTION=Repair /hideconsole" />

      <MsiPackage SourceFile="ShortcutDesktop.msi" />

    </Chain>
  </Bundle>
</Wix>

Техническая причина: я не эксперт по проектам установщика Visual Studio - это нужно сказать - каждый раз. Однако, как вы обнаружили, у этих проектов есть ряд ограничений и изюминок. Одна из странностей заключается в том, что все пользовательские действия выполняются в отложенном режиме и в системном контексте (выполняются как LocalSystem) без олицетворения запускающего пользователя. Это, вероятно, причина видимой проблемы - как вы сами заявляете.

Хотя существует возможность постобработки MSI, полученного из проектов VS Installer, лучше исключить использование настраиваемого действия для запуска установки SQL Server. Более подробная информация ниже. Постобработка будет включать в себя изменение типа настраиваемого действия с 3078 на 1030, так что пользовательская олицетворение будет включено - что также означает, что настраиваемое действие не выполняется с повышенным уровнем - и, следовательно, может быть успешным, только если весь MSI был запущен с повышенным уровнем.


Примечание. Ниже я предлагаю использовать функцию записи WiX (с открытым исходным кодом) или эквивалентный, способный коммерческий инструмент. Функцию записи WiX можно использовать с файлами MSI, созданными в проекте установщика Visual Studio 2017, или с файлами MSI, созданными любым другим инструментом (в том числе EXE-файлами). Вы просто подключаете сгенерированный VS2017 MSI к пакету WiX (или к файлу EXE). Очевидно, что WiX также может создавать файлы MSI (для этого и нужна инфраструктура). WiX ссылки быстрого старта.


Привычка к технологии MSI: отстранение других установщиков от пользовательских действий MSI не является хорошей практикой. Если другой установщик - это другой MSI (а не просто не-MSI setup.exe), то это даже невозможно сделать надежно из-за технических ограничений (нет двух MSI InstallExecuteSequences может работать одновременно из-за мьютекса, установленного во время установки). Другими словами: одновременные установки MSI запрещены и технически невозможны.

Burn: введите функцию записи WiX - downloader / bootstrapper / sequencer инструмент, который запускает инсталляцию пакетов из своей собственной оболочки setup.exe, Он может устанавливать файлы MSI, EXE-файлы и другие виды пакетов - один за другим без технических ограничений, таких как мьютекс MSI. Серийный, а не параллельный запуск.

Установка SQL Server: Вы можете удалить установщик SQL Server EXE с помощью такого комплекта записи Burn, и вы можете указать параметры, которые вы перечислите в качестве параметров командной строки, вместо того, чтобы делать это в управляемом коде (с соответствующими требованиями времени выполнения). Затем вы запускаете основной MSI из того же пакета.

Burn Crash Course: для Burn есть кривая обучения. Это "неудобно" (это код / ​​разметка - всегда неудобно), но оно очень гибкое. Я хочу добавить, что Advanced Installer, кажется, имеет хорошую поддержку для развертывания SQL Server, даже если у него никогда не было времени для подробного расследования. Installshield может устанавливать EXE-файлы и MSI-файлы последовательно, используя функцию проектов Suite (см. Связанный снимок экрана). Не уверен в общей поддержке SQL Server.

Некоторые ссылки для примера записи:


Некоторые ссылки:

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