sysadmin以外、SQL Serverエージェントジョブの非所有者に実行を許可する


9

SSISパッケージを実行するジョブがあります。

現在、所有者はプロキシアカウントです。sys-adminアカウントからジョブを手動で実行できます。

当社のWebサービスは、制限付きアカウントを使用してログインします。ジョブを実行する必要があります。現在、ジョブをまったく表示できません(名前で実行しようとすると、存在しないと表示されます)。

オーナー限定のアカウントに変更してみました。これでジョブを表示できましたが、SSISパッケージを実行できなくなったため、ジョブは実行に失敗しました。

制限付きアカウントが別のアカウントが所有するジョブを実行できるようにする方法が必要ですか?

回答:


17

ユーザーが自分で実行するのに十分な権限を持っていないジョブを実行する権限を付与するメソッドを設定することが可能です。

編集: SQLAgentOperatorRoleをオプションとして明示的に言及し、3番目のソリューションにいくつかの説明を追加することによって提示される3つのオプションを明確にするため。

(1)ユーザーがすべてのジョブの実行を管理できる場合は、そのユーザーをSQLAgentOperatorRoleのメンバーにします。ユーザーは、そのサーバーでSQLエージェントジョブを開始(および停止、有効化、無効化)できます。 (このソリューションは、元の質問者を満足させることがわかりました。)

(2) Erland Sommarskogは、副署名を使用してストアドプロシージャを通じてアクセス許可を付与する方法について多くのことを書いています。彼は解決策を持っています:

http://www.sommarskog.se/grantperm.html#countersignatures

重要なポイントは次のとおりです。「誰か他の人が所有しているジョブを開始できるようにするには、固定ロールのメンバーである必要がSQLAgentOperatorRolemsdbAの開始は通話というストアドプロシージャを記述することである。sp_start_jobこの特定のジョブのためには、証明書でその手順に署名します、次に証明書からユーザーを作成し、そのユーザーをのメンバーにしSQLAgentOperatorRoleます。」

(3)私の一般的な解決策はStartAgentJobmsdbデータベースにストアドプロシージャを作成して、ユーザーが他の人が所有するジョブを開始できるようにすることでした。

これには、誰がどのジョブを実行できるかの構成を維持するためのテーブルが必要です。次のdbo.msdbJobMapテーブルはSQL Serverエージェントジョブに固有なので、テーブルをで作成しますmsdb。ただし、必要に応じて他のサービスデータベースに作成することもできます。

USE msdb;

/* Create a table to hold configuration of who can start jobs. */
CREATE TABLE dbo.msdbJobMap  
 (job_name NVARCHAR(128),
  group_name NVARCHAR(256));

/* Populate the table of allowed groups for a job 
   A group may be a single user or a Windows group. */
INSERT INTO dbo.msdbJobMap Values (N'Test it out',N'Domain\Group');
INSERT INTO dbo.msdbJobMap Values (N'Another job',N'Domain\OtherGroup');
INSERT INTO dbo.msdbJobMap Values (N'Special job',N'Domain\Joe');
INSERT INTO dbo.msdbJobMap Values (N'Special job',N'Domain\Andre');    

ストアドプロシージャは、IS_MEMBERグループメンバーシップのチェックに使用するため、指定されたグループの任意のメンバーがジョブを開始することもできます。

CREATE PROCEDURE dbo.StartAgentJob
@Job_Name NVARCHAR(128)
WITH EXECUTE AS OWNER
AS
SET NOCOUNT ON;

DECLARE @Allowed INT;
SET @Allowed = 0;

/* Since this runs as sysadmin need to check group membership of original login*/
EXECUTE AS LOGIN = ORIGINAL_LOGIN();
IF EXISTS (SELECT * FROM dbo.msdbJobMap
           WHERE job_name = @Job_Name
           AND IS_MEMBER(group_name) = 1 )
   SET @Allowed = 1;
REVERT;

/* Back to sysadmin so that we can start the job. */

IF @Allowed = 1 
    EXEC sp_start_job @job_name = @Job_Name;
ELSE
    PRINT 'Invalid attempt to start ''' + QUOTENAME(@Job_Name)+'''';
RETURN;

あなたが見ることができるように、手順が実行されているように依存sysadminの中でmsdb。のコンテキストに切り替えることで、ORIGINAL_LOGINを使用IS_MEMBERORIGINAL_LOGINて、dbo.msdbJobMapテーブルから実際にが付与されていることを確認できます。その後sysadmin、ジョブを開始できるように元の状態に戻ります。


3
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdb実際に必要なのはそれだけでした(ただし、投稿したコードは便利に見えます)ユーザーは、任意のジョブを実行することが信頼されています。どうもありがとう!
ランチャー2014

1
このコードは非常に便利です。SQLAgentOperatorRoleは、ユーザーが1つまたは2つのジョブにアクセスできるようにしたい場合、非常に広範です。
Steve Mangiameli
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.