Можно ли получить пользователя NT AUTHORITY \ NETWORK SERVICE независимым от языка? - PullRequest
9 голосов
/ 31 мая 2019

Сегодня я столкнулся с проблемой, с которой никогда не сталкивался.

Я разработал приложение, которое использует базу данных 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 на испанском языке.Установщик отправил сообщение об ошибке, сообщив, что пользователь «NT AUTHORITY \ NETWORK SERVICE» не существует.

Глядя на проблему, я обнаружил, что на этом ПК этот пользователь называется «NT AUTHORITY \ Servicio de Red»,то есть «NETWORK SERVICE» на испанском языке.

Это странно, потому что у меня есть другие ПК с Windows 10 на испанском языке, но в этой ОС пользователь также называется «NT AUTHORITY \ NETWORK SERVICE».

Чтобы решить проблему на этом компьютере, мне пришлось установить SQL Server Management Studio только для назначения пользователя «NT AUTHORITY \ Servicio de Red» для базы данных.

Поскольку я не знаю пользователязаранее, возможно ли добавить в SQL универсального пользователя, который будет работать везде?

Ответы [ 2 ]

5 голосов
/ 06 июня 2019

Да, это возможно.Чтобы решить вопрос о том, что вы ссылаетесь на учетную запись 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 голосов
/ 04 июня 2019

Не используйте учетную запись службы NT.

Создайте локальную учетную запись Windows или домена.Добавьте его как логин к SQL Server и как пользователя к нужной вам базе данных.И измените приложение службы Windows для запуска под этой учетной записью.

...