Cha*_*der 2 sql-server windows-installer burn sql-server-express visual-studio-2017
软件:
我们一直在尝试将 SQL Server Express 2016 的命名实例安装为 VS 安装程序安装项目的一部分,但没有成功。
我们已尝试InstallNamedInstance()按以下方式调用并给出结果:
SQLEXPR_x64_ENU.exe从管理员 cmd 窗口使用相同的命令行参数运行:成功InstallNamedInstance()从控制台应用程序调用并从管理员 cmd 窗口运行控制台应用程序:成功我注意到 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。
这是安装程序项目的限制还是我遗漏了什么?使用 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)
摘要:实质上,以下说明:
1)禁用自定义操作以setup.exe在您当前的 MSI 中运行 SQL Server。2)首先创建一个基础WiX Burn Bundle来启动 SQL Serversetup.exe,然后启动你的 Visual Studio 安装程序项目,然后生成MSI。或者更好的是,在 WiX 中制作整个 MSI。诸如Advanced Installer和Installshield 之类的商业工具是可行的选择 - 它们具有对此的内置支持(功能因先决条件的版本而异)。
只是为了展示 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 次 |
| 最近记录: |