web-dev-qa-db-fra.com

Est-il possible d'obtenir l'utilisateur "NT AUTHORITY \ NETWORK SERVICE" indépendamment de la langue?

J'ai rencontré aujourd'hui un problème que je n'avais jamais rencontré auparavant.

J'ai développé une application qui utilise la base de données SQL Server. Cette application dispose d'un service Windows qui accède à la base de données.

Étant donné que le service Windows utilise le service réseau en tant qu'utilisateur, je dois ajouter cet utilisateur à la base de données afin qu'il y ait accès.

Cette tâche est accomplie automatiquement par un installateur que j'ai également développé.

Dans cet installateur, j'ai ce fragment de script:

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

Ce script fonctionne presque toujours, mais aujourd'hui, l'installation.

Aujourd'hui, l'installation a été effectuée sur un PC Windows 7 en espagnol. Le programme d'installation a envoyé une erreur indiquant que l'utilisateur "NT AUTHORITY\NETWORK SERVICE" n'existe pas.

En examinant le problème, j'ai constaté que sur ce PC, cet utilisateur s'appelait "NT AUTHORITY\Servicio de Red", c'est-à-dire "NETWORK SERVICE" en espagnol.

C'est étrange parce que j'ai d'autres PC avec Windows 10 en espagnol, mais dans ce O.S., l'utilisateur s'appelle également "NT AUTHORITY\NETWORK SERVICE".

Pour résoudre le problème sur ce PC, j'ai dû installer SQL Server Management Studio uniquement pour affecter l'utilisateur "NT AUTHORITY\Servicio de Red" à la base de données.

Comme je ne connais pas le nom d'utilisateur au préalable, est-il possible d'ajouter à SQL un utilisateur générique qui fonctionnera partout?

10
jstuardo

Oui c'est possible. Pour résoudre le problème de vérification que vous faites référence au compte NT Authority\Network Service indépendamment de la langue du système d'exploitation, il existe une référence à l'adresse https://support.Microsoft.com/en-us/help/243330/well-known-security-identifiers-in-windows-operating-systems qui identifie le SID de ce compte. Il est défini comme

SID: S-1-5-20
Name: NT Authority
Description: Network Service

Remarque: les chiffres semblent être exprimés en nombres décimaux.

Si dans votre studio de gestion SQL Server vous sélectionnez parmi sys.server_principals:

select * from sys.server_principals

vous verrez que NETWORK SERVICE a une valeur SID de 0x010100000000000514000000 la partie '514' (c'est hexa) correspond à la 5-20 (décimale).

Si vous vérifiez l'instruction suivante dans une fenêtre de requête:

select quotename(SUSER_SNAME(0x010100000000000514000000))

vous verrez le résultat: [AUTORITÉ NT\SERVICE RÉSEAU]

Avec ceci en main, votre déclaration de création originale devient:

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;

Et vous obtiendrez le compte créé souhaité.

À votre santé.

6

N'utilisez pas de compte de service NT.

Créez un compte local Windows ou de domaine. Ajoutez-le en tant que connexion à SQL Server et en tant qu'utilisateur à la base de données dont vous avez besoin. Et changez votre application de service Windows pour qu'elle s'exécute sous ce compte.

2
Daniel N