私はSQL 2008サーバー(サーバーA)で仕事をしています(これは理想的ではないことを知っています...この問題は解決されています)。エージェントはNT AUTHORITY\NETWORK SERVICEの下で実行されます。
別のSQL 2014サーバー(サーバーB)にあるジョブを実行するステップを追加したいと思います。
私は使うだろう:
EXEC [Server B].msdb..sp_start_job N'JobName'
サーバーAから手動で実行すると、サーバーBでジョブが正常に実行されます。
サーバーAのジョブにタスクを追加すると、次のメッセージで失敗します。
ユーザーとして実行:NT AUTHORITY\NETWORK SERVICE。 EXECUTE権限は、オブジェクト 'sp_start_job'、データベース 'msdb'、スキーマ 'dbo'で拒否されました。 [SQLSTATE 42000](エラー229)。ステップは失敗しました。
サーバーBのNT AUTHORITY\NETWORK SERVICEをmsdbの 'TargetServerRole'に割り当て、ユーザーにSP_Start_JobおよびSP_Stop_Jobの実行権限を与えました。
サーバーAにはリンクサーバーとしてサーバーBがあり、「ローカルサーバーログインからリモートサーバーログインへのマッピング」を設定しようとしましたが、ローカルログインNT AUTHORITY\NETWORK SERVICEは偽装しています。
ジョブはまだ同じエラーで失敗します。
何をする必要がありますか?
ありがとう
sp_start_job
またはsp_stop_job
への直接アクセスを許可したくない場合や、SQLAgentOperatorRole
を介してNT AUTHORITY\NETWORK SERVICE
またはMyDomain\ServerA$
。これらの組み合わせを実行すると、少なくとも、ServerAでNT AUTHORITY\NETWORK SERVICE
として実行されているすべてのプロセスが、ServerBで任意のジョブを開始および/または停止できるようになります。
Module Signing を使用すると、MyDomain\ServerA$
(または任意のログインまたはロール、あるいはそれらの任意の組み合わせ)が特定の1つのジョブのみを開始および停止できるように、非常に細かい権限を設定できます。
USE [msdb];
GO
CREATE PROCEDURE dbo.StartStopJobX
(
@Operation VARCHAR(10) = 'start'
)
AS
IF (@Operation = 'start')
BEGIN
EXEC dbo.sp_start_job N'{job_name}';
END
ELSE
BEGIN
EXEC dbo.sp_stop_job N'{job_name}';
END;
GO
CREATE CERTIFICATE [SqlAgentPermissions]
ENCRYPTION BY PASSWORD = 'change_me'
WITH SUBJECT = 'Allow low-priviledged accounts to start/stop certain jobs',
EXPIRY_DATE = '2099-12-31';
ADD SIGNATURE
TO dbo.StartStopJobX
BY CERTIFICATE [SqlAgentPermissions]
WITH PASSWORD = 'change_me';
CREATE USER [SqlAgentPermissions] FROM CERTIFICATE [SqlAgentPermissions];
ALTER ROLE [SQLAgentOperatorRole] ADD MEMBER [SqlAgentPermissions];
今、あなたがする必要があるのは:
GRANT EXECUTE ON dbo.[StartStopJobX] TO [MyDomain\ServerA$];
NT AUTHORITY\NETWORK SERVICE
はローカルアカウントですが、サーバーのコンピューターアカウントを使用してネットワーク上で認証できます(サーバーがドメインに参加している場合)。
サーバーAのコンピューターアカウントのログインをサーバーBに作成する必要があります。
たとえば、サーバーAのコンピューター名が "ServerA"の場合、そのコンピューターアカウントの名前は "ServerA $"なので、次のようになります。
use msdb
create login [MyDomain\ServerA$] from Windows
create user [MyDomain\ServerA$] for login [MyDomain\ServerA$]
alter role SQLAgentOperatorRole add member [MyDomain\ServerA$]