我正在尝试从安装程序类将数据库安装到LocalDB。尝试打开SQLConnection时,出现错误:
Login failed for user 'NT AUTHORITY\SYSTEM'
似乎安装程序类是从系统帐户运行的,而且它不能使用LocalDB。
有没有办法从安装程序连接LocalDB?
也许可以从用户帐户运行安装程序类(或其中的部分代码)(但安装程序的其余操作仍然需要管理权限)?
安装程序可以在不同的计算机上使用,因此我无法事先知道用户的凭据,也无法手动对系统进行任何更改,只能从安装程序类代码(C#)进行。
答案 0 :(得分:0)
我还没有解决这个问题并放弃了LocalDB。但是一段时间后我遇到了类似的问题 - 从Windows服务连接到LocalDB。 Windows服务从相同的NT AUTHORITY\SYSTEM
帐户运行,因此在这种情况下,相同的解决方案可能有所帮助。
解决方案是使用LocalDB共享实例。实例通过SqlLocalDB utility进行管理。
创建一个新的LocalDB实例:
SqlLocalDB.exe create "InstanceName"
分享实例:
SqlLocalDB.exe share "InstanceName" "SharedInstanceName"
启动实例:
SqlLocalDB.exe start "InstanceName"
共享实例名为.\SharedInstanceName
,因此在您的连接字符串中,它看起来像(localdb)\.\SharedInstanceName
。您可以使用以下命令查找实例名称:
SqlLocalDB.exe info
使用sqlcmd utility连接到实例,并将NT AUTHORITY\SYSTEM
用户添加到SQL用户并为其设置适当的权限:
sqlcmd.exe -S (localdb)\.\SharedInstanceName -i "<path-to-SQL-file>"
SQL文件内容:
CREATE LOGIN [NT AUTHORITY\SYSTEM] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [NT AUTHORITY\SYSTEM]
GO
<小时/> 一个假设(我没有检查过):由于某种原因,SQL安装程序类似乎是从
NT AUTHORITY\SYSTEM
帐户运行的,所以如果你尝试从安装程序类执行上述步骤,那么尝试连接到实例时,第5步很可能会失败。因此,这些步骤需要以其他方式完成,例如来自.bat
文件,该文件在运行安装程序类之前直接从安装程序运行。< / LI> 醇>