web-dev-qa-db-ja.com

別のSQLサーバーインスタンスからジョブを開始する

私は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は偽装しています。

ジョブはまだ同じエラーで失敗します。

何をする必要がありますか?

ありがとう

4
Round

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$];
6
Solomon Rutzky

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$]