web-dev-qa-db-ja.com

言語に関係なく「NT AUTHORITY \ 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を搭載した他のPCを持っているのでそれは奇妙ですが、その米国では、ユーザーは「NT AUTHORITY\NETWORK SERVICE」とも呼ばれます。

そのPCの問題を解決するには、SQL Server Management Studioをインストールして、 "NT AUTHORITY\Servicio de Red"ユーザーをデータベースに割り当てるだけでした。

ユーザー名が事前にわからないので、SQLにどこでも機能する汎用ユーザーを追加することはできますか?

10
jstuardo

はい、可能です。 OS言語に関係なく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

注:数値は10進数として表現されているようです。

SQL Server管理スタジオでsys.server_principalsから選択した場合:

select * from sys.server_principals

nETWORK SERVICEのSID値が0x010100000000000514000000であることがわかります。'514 '(これはヘキサです)の部分は5〜20(10進数)に対応しています。

クエリウィンドウで次のステートメントを確認すると、

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;

そして、必要な作成済みアカウントを取得します。

乾杯。

NTサービスアカウントを使用しないでください。

ローカルウィンドウまたはドメインアカウントを作成します。 SQL Serverへのログインおよび必要なデータベースへのユーザーとして追加します。そして、そのアカウントで実行するようにWindowsサービスアプリケーションを変更します。

2
Daniel N