【发布时间】:2019-08-12 16:48:10
【问题描述】:
我有一个 Windows 服务,它在安装期间创建一个命名的 sql localdb 实例。我在安装过程中以本地系统帐户执行命令,可以创建、信息查询和启动实例。 我正在使用作为本地系统帐户运行的 wix 自定义操作来创建它,它可以顺利启动:
<!-- Custom action for creating a named localdb instance -->
<CustomAction Id="CA_SetPropertiesCreateLocalDbInstance" Property="CA_CreateLocalDbInstance" Value="InstanceName=MyLocalDbInstance" />
<CustomAction Id="CA_CreateLocalDbInstance" BinaryKey="BIN_CustomActions" DllEntry="CreateLocalDbInstance" Execute="deferred" Impersonate="no" Return="check" HideTarget="no" />
<!-- Schedule the Custom Actions -->
<InstallExecuteSequence>
<Custom Action="CA_SetPropertiesCreateLocalDbInstance" Before="CA_CreateLocalDbInstance">NOT Installed</Custom>
<Custom Action="CA_CreateLocalDbInstance" Before="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>
安装期间运行的自定义操作的日志:
Executing command 'sqllocaldb c MyLocalDbInstance'
command output>> LocalDB instance "MyLocalDbInstance" created with version 14.0.3162.1.
command exit code>> 0
Executing command 'sqllocaldb s MyLocalDbInstance'
command output>> LocalDB instance "MyLocalDbInstance" started.
command exit code>> 0
Executing command 'sqllocaldb i MyLocalDbInstance'
command output>> Name: MyLocalDbInstance
command output>> Version: 14.0.3162.1
command output>> Shared name:
command output>> Owner: NT AUTHORITY\SYSTEM
command output>> Auto-create: No
command output>> State: Running
command output>> Last start time: 8/8/2019 11:40:23 PM
command output>> Instance pipe name: np:\\.\pipe\LOCALDB#3FB77699\tsql\query
command exit code>> 0
但是,当我在应用程序运行时尝试访问 localdb 实例时,我收到错误 error: 50 - Local Database Runtime error occurred. The specified LocalDB instance does not exist.
如果我使用 psexec.exe (MSFT tool for powershell) 以 localsystem 帐户运行 sqllocaldb 查询,我可以看到我创建的 localdb 实例:
PS C:\WINDOWS\system32> whoami
nt authority\system
PS C:\WINDOWS\system32> sqllocaldb i
MSSQLLocalDB
MyLocalDbInstance
我可以访问默认实例的信息没问题,但尝试查询创建的实例会导致错误:
PS C:\WINDOWS\system32> sqllocaldb i MyLocalDbInstance
Printing of LocalDB instance "MyLocalDbInstance" information failed because of the following error:
LocalDB instance "MyLocalDbInstance" doesn't exist!
有趣的是,如果我再次从 localsystem powershell 实例运行“sqllocaldb c MyLocalDbInstance”,它会创建一个新实例。 “sqllocaldb c MyLocalDbInstance”命令的后续执行只会覆盖新创建的:
PS C:\WINDOWS\system32> sqllocaldb c MyLocalDbInstance
LocalDB instance "MyLocalDbInstance" created with version 14.0.3162.1.
PS C:\WINDOWS\system32> sqllocaldb c MyLocalDbInstance
LocalDB instance "MyLocalDbInstance" created with version 14.0.3162.1.
PS C:\WINDOWS\system32> sqllocaldb i
MSSQLLocalDB
MyLocalDbInstance
MyLocalDbInstance
我很困惑,并且可能缺少以下知识之一来追踪问题:
-奇怪的 windows-user 划分阻止访问的东西
-sqllocaldb 的内部复杂性
-与 psexec.exe 的人工交互掩盖了真正的问题
我的下一个调试步骤可能是在 安装,但出于安全原因,这是不可取的。
如果有人真的想深入研究,我可以尝试使用虚拟安装程序建立一个虚拟项目。
【问题讨论】:
-
不幸的是,我认为这是为了创建 sql 数据库,我需要实际创建一个 localdb 实例,然后将数据库添加到该实例。我试图在安装期间与本机 localdb api 交互,而不求助于第三方解决方案,试图弄清楚为什么我的基本级别“只使用 cli”没有按预期工作
标签: wix windows-installer localdb