【发布时间】:2019-05-30 22:56:06
【问题描述】:
我今天遇到了一个以前从未遇到过的问题。
我开发了一个使用 SQL Server 数据库的应用程序。该应用程序有一个访问数据库的 Windows 服务。
由于 Windows 服务使用网络服务作为用户,我需要将该用户添加到数据库中,以便它可以访问它。
该任务由我开发的安装程序自动完成。
在那个安装程序中,我有这个脚本片段:
USE [MyDB]
GO
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = 'NT AUTHORITY\NETWORK SERVICE')
BEGIN
/****** Object: User [NT AUTHORITY\NETWORK SERVICE] Script Date: 26-10-2018 13:42:57 ******/
CREATE USER [NT AUTHORITY\NETWORK SERVICE] FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] WITH DEFAULT_SCHEMA=[dbo]
ALTER ROLE [db_owner] ADD MEMBER [NT AUTHORITY\NETWORK SERVICE]
END
该脚本几乎总是有效,但今天安装。
今天的安装是在一台 Windows 7 PC 上进行的,它是西班牙语的。安装程序发送一条错误消息,提示“NT AUTHORITY\NETWORK SERVICE”用户不存在。
查看问题,我发现在那台PC中,那个用户被称为“NT AUTHORITY\Servicio de Red”,即西班牙语中的“NETWORK SERVICE”。
这很奇怪,因为我有其他 PC 的 Windows 10 西班牙语版本,但在那个操作系统中,用户也被称为“NT AUTHORITY\NETWORK SERVICE”。
为了解决那台 PC 中的问题,我只需要安装 SQL Server Management Studio 才能将“NT AUTHORITY\Servicio de Red”用户分配给数据库。
由于我事先不知道用户名,是否可以在 SQL 中添加一个通用用户,在任何地方都可以使用?
【问题讨论】:
-
您的 Windows 服务是作为独立服务运行还是在 IIS 中运行?如果在 IIS 中,您可以使用应用程序池标识功能。第二个问题是,您是否在单个域上运行它?如果是这样,您可以在域中创建一个服务帐户并将服务设置为在此帐户下运行,然后您只需将该服务帐户添加到安装程序中的数据库。
-
更好的选择是在虚拟服务帐户 (
NT SERVICE\<ServiceName>) 下运行服务。您无需提前创建这些用户,他们始终拥有服务的名称(因此完全可以预测),Windows 会自动为他们管理密码。 -
你的问题 does 有一个字面答案,顺便说一下(你可以在 SQL Server 中使用其众所周知的 SID 获取此帐户的本地名称),但我我犹豫是否提供,因为这显然是错误的事情。
-
@Brenton 它是一个独立的服务,应该以最高权限运行......这就是我无法创建新用户的方式。我能看到的唯一解决方案是创建一个 SQL Server 用户,但它的缺点是它取决于 SQL Server 配置。并非所有客户都允许 SQL Server 和 Windows 身份验证。
-
@JeroenMostert 你能进一步解释一下吗?该用户是否拥有所有操作系统资源的完全权限?
标签: sql-server security windows-authentication database-security network-service