sql-server - 是否有可能获得与语言无关的 "NT AUTHORITY\NETWORK SERVICE"用户?

标签 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 的电脑,但在该操作系统中,用户也称为“NT AUTHORITY\NETWORK SERVICE”。

为了解决该 PC 中的问题,我必须安装 SQL Server Management Studio,仅将“NT AUTHORITY\Servicio de Red”用户分配给数据库。

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

最佳答案

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

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

干杯。

关于sql-server - 是否有可能获得与语言无关的 "NT AUTHORITY\NETWORK SERVICE"用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56386638/

相关文章:

java - 缓存 KeyStore 的内容并将其转换为 InputStream

c# - 具有 Windows 身份验证的 WPF 应用程序

asp.net - 使用集成 Windows 身份验证接收登录提示

javascript - 当使用来自其他域的图像时,为什么我的导航器会污染 Canvas ?

asp.net - iis7中的windows身份验证

mysql - 分组依据和列选择

sql - 寻找凌乱的 SQL ISNULL/NULLIF 的替代方案

sql-server - TSQL合并: When not matched by target then insert if (condition)

mysql - 我想要该特定股票,最后两条平均价格记录是 < 当前价格(按 Scrip_Id、日期排序)

google-chrome - Chrome 和 Safari 不支持 HPKP