我今天遇到了一个从未遇到过的问题。
我已经开发了使用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”。
这很奇怪,因为我还有其他安装了Windows 10西班牙语的PC,但在该操作系统中,用户也被称为“ NT AUTHORITY \ NETWORK SERVICE”。
要解决该PC上的问题,我只需要安装SQL Server Management Studio即可将“ NT AUTHORITY \ Servicio de Red”用户分配给数据库。
由于我事先不知道用户名,是否可以向SQL添加可以在任何地方工作的通用用户?
答案 0 :(得分:5)
是的,有可能。为解决确保独立于OS语言引用NT Authority \ Network Service帐户的问题,https://support.microsoft.com/en-us/help/243330/well-known-security-identifiers-in-windows-operating-systems处有一个引用,用于标识该帐户的SID。定义为
SID: S-1-5-20
Name: NT Authority
Description: Network Service
注意:数字似乎用十进制数字表示。
如果在SQL Server管理工作室中从sys.server_principals中选择:
select * from sys.server_principals
您将看到NETWORK SERVICE的SID值为0x010100000000000514000000 “ 514”(这是十六进制)部分对应于5-20(十进制)。
如果在查询窗口中检查以下语句:
select quotename(SUSER_SNAME(0x010100000000000514000000))
您将看到结果:[NT AUTHORITY \ NETWORK SERVICE]
有了这个,您的原始创建语句将变为:
DECLARE @user nvarchar(50)
DECLARE @SQLStatement nvarchar(500)
SET @user = quotename(SUSER_SNAME(0x010100000000000514000000));
SET @SQLStatement =
N'IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = ''NT AUTHORITY\NETWORK SERVICE'')
BEGIN
CREATE USER [NT AUTHORITY\NETWORK SERVICE] FOR LOGIN ' + @user + N' WITH DEFAULT_SCHEMA=[dbo]
ALTER ROLE [db_owner] ADD MEMBER [NT AUTHORITY\NETWORK SERVICE]
END'
EXEC sp_executesql @SQLStatement;
您将获得所需的已创建帐户。
干杯。
答案 1 :(得分:2)
不要使用NT服务帐户。
创建本地Windows或域帐户。将其添加为登录到SQL Server以及作为用户添加到所需的数据库。并将Windows服务应用程序更改为在该帐户下运行。