Именованный экземпляр SQL Server с проектом установщика Visual Studio 2017 - PullRequest
0 голосов
/ 28 августа 2018

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

  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 ]

0 голосов
/ 29 августа 2018

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

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

0 голосов
/ 29 августа 2018

Сводка : По сути, следующие состояния: 1) Отключить настраиваемое действие для запуска SQL Server setup.exe в вашем текущем MSI. 2) Создать базовый WiX Burn Bundle для запуска SQL Сервер 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 Technology Quirk : Отстранение других установщиков от пользовательских действий MSI не является хорошей практикой. Если другой установщик - это другой MSI (а не просто не-MSI setup.exe), то это невозможно даже сделать надежно из-за технических ограничений (два MSI InstallExecuteSequences не могут работать при в то же время из-за мьютекс, который устанавливается во время установки ). Другими словами: одновременные установки MSI запрещены и технически невозможны.

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

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

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

Некоторые ссылки на образцы записи :


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

...