【问题标题】:Is it possible to get "NT AUTHORITY\NETWORK SERVICE" user independent of language?是否可以获得独立于语言的“NT AUTHORITY\NETWORK SERVICE”用户?
【发布时间】:2019-05-30 22:56:06
【问题描述】:

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

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

【问题讨论】:

  • 您的 Windows 服务是作为独立服务运行还是在 IIS 中运行?如果在 IIS 中,您可以使用应用程序池标识功能。第二个问题是,您是否在单个域上运行它?如果是这样,您可以在域中创建一个服务帐户并将服务设置为在此帐户下运行,然后您只需将该服务帐户添加到安装程序中的数据库。
  • 更好的选择是在虚拟服务帐户 (NT SERVICE\<ServiceName>) 下运行服务。您无需提前创建这些用户,他们始终拥有服务的名称(因此完全可以预测),Windows 会自动为他们管理密码。
  • 你的问题 does 有一个字面答案,顺便说一下(你可以在 SQL Server 中使用其众所周知的 SID 获取此帐户的本地名称),但我我犹豫是否提供,因为这显然是错误的事情。
  • @Brenton 它是一个独立的服务,应该以最高权限运行......这就是我无法创建新用户的方式。我能看到的唯一解决方案是创建一个 SQL Server 用户,但它的缺点是它取决于 SQL Server 配置。并非所有客户都允许 SQL Server 和 Windows 身份验证。
  • @JeroenMostert 你能进一步解释一下吗?该用户是否拥有所有操作系统资源的完全权限?

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


【解决方案1】:

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

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

干杯。

【讨论】:

    【解决方案2】:

    不要使用 NT 服务帐户。

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

    【讨论】:

    • 这不是选项。我需要该服务以最高安全级别运行。如果我创建一个新用户,该用户在访问更多受限资源时会遇到问题。
    • 在这里看不到问题,创建一个具有提升权限的 Windows 帐户。在新的“服务”帐户下运行您的应用程序并在网络服务下运行 sql server(不是最好的主意)
    • 什么不是最好的主意?创建一个新用户?无论如何,这是一个大问题。您假设我将拥有对机器的完全访问权限,但情况并非总是如此。作为公司一部分的 PC 或服务器通常受到很大限制。他们不允许创建 Windows 用户。此外,软件的安装应该非常简单。我有一个应该做所有事情的安装程序。如果我尝试执行需要某种其他权限的操作,安装程序肯定会失败。这就是为什么我需要使用我所知道的已经存在于每台计算机中的东西。
    • 让sql server在网络服务下运行不是个好主意。如果您单独安装最新版本的 sql server,请注意它使用了其他一些帐户名称,例如 machinenamesql$,它是一个服务帐户,而不是网络服务。您的安装程序也可以这样做。
    • 我没有将 SQL Server 作为网络服务运行。为什么会这样想?
    猜你喜欢
    • 2020-09-04
    • 2011-01-16
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多