11

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

我开发了一个使用 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 添加一个通用用户,该用户在任何地方都可以使用?

4

2 回答 2

6

对的,这是可能的。要解决确保您引用独立于操作系统语言的 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;

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

干杯。

于 2019-06-06T05:15:53.027 回答
2

不要使用 NT 服务帐户。

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

于 2019-06-04T14:15:03.823 回答