是否可以获得独立于语言的“ NT AUTHORITY \ NETWORK SERVICE”用户?

时间:2019-05-30 22:56:06

标签: sql-server security windows-authentication database-security network-service

我今天遇到了一个从未遇到过的问题。

我已经开发了使用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添加可以在任何地方工作的通用用户?

2 个答案:

答案 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服务应用程序更改为在该帐户下运行。