带有 Visual Studio 2017 安装程序项目的 SQL Server 命名实例

Cha*_*der 2 sql-server windows-installer burn sql-server-express visual-studio-2017

软件:

  1. SQL Server Express 2016
  2. 视觉工作室 2017

我们一直在尝试将 SQL Server Express 2016 的命名实例安装为 VS 安装程序安装项目的一部分,但没有成功。

我们已尝试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.aspxhttp://msdn.microsoft.com/en-us/library/ms813959.aspxHTTP:// MSDN .microsoft.com/en-us/library/ms813847.aspx

这是安装程序项目的限制还是我遗漏了什么?使用 AdvancedInstaller 会有更好的运气吗?

请注意,安装程序项目的先决条件对我们不起作用,因为我们必须创建 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*mul 6

摘要:实质上,以下说明:1)禁用自定义操作以setup.exe在您当前的 MSI 中运行 SQL Server。2)首先创建一个基础WiX Burn Bundle来启动 SQL Serversetup.exe,然后启动你的 Visual Studio 安装程序项目,然后生成MSI。或者更好的是,在 WiX 中制作整个 MSI。诸如Advanced InstallerInstallshield 之类的商业工具是可行的选择 - 它们具有对此的内置支持(功能因先决条件的版本而异)。

Burn Bundle-Mockup灵感更多灵感):

只是为了展示 WiX Burn 标记的工作原理:

<?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>
Run Code Online (Sandbox Code Playgroud)

技术原因:我不是 Visual Studio 安装程序项目的专家 - 不得不说 - 每次。但是,正如您所发现的,这些项目有许多限制和怪癖。怪癖之一是所有自定义操作都以延迟模式和系统上下文(作为 LocalSystem 运行)运行,而不会模拟启动用户。这很可能是所见问题的原因 - 正如您自己所说。

尽管可以对 从 VS 安装程序项目获得的 MSI进行后处理,但最好不要使用自定义操作来启动 SQL Server 安装。更多详情如下。后处理将涉及将自定义操作类型从 3078 更改为 1030,以便启用用户模拟 - 这也意味着自定义操作不会顺便提升 - 因此只有在整个 MSI 启动时才能成功。


注意:下面我建议使用 WiX 的刻录功能(开源)或等效的功能强大的商业工具。WiX 的刻录功能可用于 Visual Studio 2017 安装程序项目创建的 MSI 文件,或任何其他工具创建的 MSI 文件(也包括 EXE 文件)。您只需将 VS2017 生成的 MSI 插入 WiX 捆绑包(或 EXE 文件)。WiX 显然也可以自己创建 MSI 文件(这就是框架的用途)。WiX 快速入门链接


MSI 技术怪癖:从 MSI 自定义操作中启动其他安装程序不是一个好习惯。如果另一个安装程序是另一个 MSI(而不仅仅是非 MSI setup.exe),那么由于技术限制,甚至不可能可靠地这样做(InstallExecuteSequences由于互斥锁,没有两个 MSI可以同时运行)安装时设置)。换句话说:同时安装 MSI 是被禁止的,并且在技术上是不可能的。

烧伤:输入维克斯的刻录功能-对downloader/bootstrapper/sequencer它运行安装包从它自己的包装序列工具setup.exe。它可以安装 MSI 文件、EXE 文件和其他类型的包——一个接一个地安装,没有像 MSI 的互斥锁那样的技术限制。串行,而不是并行运行。

SQL Server 安装:您可以通过这样的 Burn bundle 启动 SQL Server EXE 安装程序,并且可以将列出的参数指定为命令行参数,而不是在托管代码中这样做(需要运行时要求)。然后你从同一个捆绑包中开始你的主要 MSI。

烧伤速成课程烧伤有一个学习曲线。它是“繁琐的”(它是代码/标记 - 总是繁琐的),但它非常灵活。我想补充一点,高级安装程序似乎对SQL Server 部署有很好的支持,即使从来没有时间进行详细调查。Installshield可以使用其套件项目功能按顺序安装 EXE 文件和 MSI 文件(检查链接的屏幕截图)。不确定整体 SQL Server 支持。

一些刻录示例链接


一些链接


归档时间:

查看次数:

1743 次

最近记录:

7 年,4 月 前