我在 Active Directory 域环境中运行 SQL Server 2012。我根据以下说明为 SQL 服务设置了一个托管服务帐户以运行该帐户:这个文件。由于我的域功能级别是 2008,因此它是常规 MSA 而不是 gMSA(组)。到目前为止一切顺利。问题是我想要将数据库备份到 UNC 共享。如果 SQL 服务在常规域帐户下运行,则不会出现问题,但托管服务帐户无法写入共享目录。我明确在该共享的安全设置中授予了权限,但 SQL 在尝试进行备份时仍会抛出错误。具体来说,错误消息显示:
System.Data.SqlClient.SqlError:无法打开备份设备“\remoteserver\Backupshare\SQLbkup.bak”。操作系统错误 1808(使用的帐户是计算机帐户。请使用您的全局用户帐户或本地用户帐户访问此服务器。)。(Microsoft.SqlServer.Smo)
[实际备份路径因编辑目的而改变]
搜索错误消息只得到不相关的结果。technet 上的一些讨论表明应该可以授予 MSA 在远程目录中写入的权限。知道我遗漏了什么吗?
2018年4月26日编辑:
在我的原始帖子中,我忘了提到我想要写入的特定共享是 Netapp 设备上的 CIFS 共享。我没有提到它,因为我认为它不相关。但是,随着我继续研究这个问题并进行更多测试,似乎这确实可能是 Netapp 的问题。作为测试,我在普通的 Windows 7 机器上创建了一个共享,并尝试在那里写入我的 SQL 备份。只要我授予目标目录的 MSA 权限,它就可以工作。当我查看 Windows 7 机器上的安全日志时,我看到传入连接正在使用 MSA 凭据,无论我是否在 SQL 代理中使用代理。
因此,在 SQL 方面,似乎即使作业以域管理员身份启动,bak 文件的实际写入操作也是以托管服务帐户的身份进行的。如果目标是域中的 Windows 计算机,它可以接受传入连接。但是,Netapp 不能 - 至少对于我们拥有的 Data ONTAP 版本来说不能。所以看起来我们陷入了僵局。不过,感谢 Katherine 的回复,这帮助我学到了很多东西。:)
答案1
您的备份作业正在运行SQL 代理用户。 我认为 SQL Agent 正在作为您的 MSA 运行?
我在测试环境中亲自遇到了这个问题,当我授予服务器的计算机帐户访问共享的权限时,备份成功了。由于这只是一个测试环境,我认为这已经足够好了。我不知道这对您是否有用,或者您是否想进一步追踪它。
我想问题可能在于没有分配 MSA SeAssignPrimaryTokenPrivilege
。 SQL 代理代理所需的权限是:
- 绕过遍历检查的权限(SeChangeNotifyPrivilege)
- 替换进程级令牌的权限(SeAssignPrimaryTokenPrivilege)
- 调整进程内存配额的权限(SeIncreaseQuotaPrivilege)
- 从网络访问此计算机的权限(SeNetworkLogonRight)
老实说,我希望不为 MSA 分配这些权限会导致代理作业回退到 MSA 用户帐户而不是计算机帐户,但您的错误消息和我的测试环境表明并非如此。