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

jst*_*rdo 10 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
Run Code Online (Sandbox Code Playgroud)

该脚本几乎总是可以运行,但今天可以安装。

今天,安装是在Windows 7 PC(西班牙语)中进行的。安装程序发送了一条错误消息,提示“ NT AUTHORITY \ NETWORK SERVICE”用户不存在。

查看此问题,我发现该用户在该PC上被称为“ NT AUTHORITY \ Servicio de Red”,即西班牙语中的“ NETWORK SERVICE”。

这很奇怪,因为我还有其他安装有Windows 10西班牙语的PC,但是在该OS中,用户也被称为“ NT AUTHORITY \ NETWORK SERVICE”。

为了解决该PC上的问题,我只需要安装SQL Server Management Studio即可将“ NT AUTHORITY \ Servicio de Red”用户分配给数据库。

由于我事先不知道用户名,是否可以向SQL添加可以在任何地方工作的通用用户?

Cri*_*bal 6

对的,这是可能的。要解决确保独立于OS语言引用NT Authority \ Network Service帐户的问题,请参阅https://support.microsoft.com/en-us/help/243330/well-known。 Windows操作系统中的-security-identifiers,用于标识此帐户的SID。定义为

SID: S-1-5-20
Name: NT Authority
Description: Network Service
Run Code Online (Sandbox Code Playgroud)

注意:数字似乎表示为十进制数字。

如果在SQL Server Management Studio中从sys.server_principals中选择:

select * from sys.server_principals
Run Code Online (Sandbox Code Playgroud)

您会看到NETWORK SERVICE的SID值为0x010100000000000514000000,“ 514”(这是十六进制)部分对应于5-20(十进制)。

如果在查询窗口中检查以下语句:

select quotename(SUSER_SNAME(0x010100000000000514000000))
Run Code Online (Sandbox Code Playgroud)

您会看到结果:[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;
Run Code Online (Sandbox Code Playgroud)

然后,您将获得所需的创建帐户。

干杯。


Dan*_*l N 2

不要使用 NT 服务帐户。

创建本地 Windows 或域帐户。将其添加为 SQL Server 的登录名以及所需数据库的用户。并将您的 Windows 服务应用程序更改为在该帐户下运行。