今日、私はこれまで直面したことのない問題に遭遇しました。
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にどこでも機能する汎用ユーザーを追加することはできますか?
はい、可能です。 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サービスアプリケーションを変更します。