Permitir que não seja administrador de sistemas e não proprietário de um trabalho do SQL Server Agent executá-lo

9

Eu tenho um trabalho que executa um pacote SSIS.

Atualmente, o proprietário é uma conta proxy. Eu posso executar o trabalho manualmente a partir de uma conta sys-admin.

Nosso serviço da Web efetua login usando uma conta limitada. Ele precisa executar o trabalho. Atualmente, ele não consegue ver o trabalho (quando tento executar pelo nome, ele diz que não existe).

Tentei mudar para o proprietário do trabalho para a conta limitada. Agora ele podia ver o trabalho, mas o trabalho falhou na execução porque não pode mais executar o pacote SSIS.

Tem que haver uma maneira de permitir que a conta limitada execute um trabalho de propriedade de outra conta, certo?

Triturador
fonte

Respostas:

17

É possível configurar um método para conceder direitos para executar uma tarefa que um usuário não possui autoridade suficiente para executar por conta própria.

Edição: para maior clareza sobre as três opções apresentadas, mencionando explicitamente o SQLAgentOperatorRole como uma opção e adicionando algumas explicações sobre a terceira solução.

(1) Se o usuário tiver permissão para gerenciar a execução de todas as tarefas, torne esse usuário membro de SQLAgentOperatorRole. O usuário poderá iniciar (além de parar, ativar e desativar) qualquer trabalho do SQL Agent nesse servidor. (Essa solução acabou satisfazendo o solicitante original.)

(2) Erland Sommarskog escreveu muito sobre como conceder permissões por meio de procedimentos armazenados usando contra-assinaturas. Ele tem uma solução em:

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

O ponto-chave é: "Para ser capaz de iniciar um trabalho de propriedade de outra pessoa, você precisa ser membro da função fixa SQLAgentOperatorRoleem msdbUm começo é escrever um procedimento armazenado que as chamadas. sp_start_jobPara este trabalho específico, assinar esse procedimento com um certificado e crie um usuário a partir do certificado e faça desse usuário um membro SQLAgentOperatorRole".

(3) Minha resolução geral foi criar um StartAgentJobprocedimento armazenado no msdbbanco de dados, permitindo que um usuário iniciasse trabalhos pertencentes a outras pessoas.

Isso requer uma tabela para manter a configuração de quem pode executar qual trabalho. Como a dbo.msdbJobMaptabela a seguir é específica da tarefa do SQL Server Agent, eu criaria a tabela msdb. Mas poderia ser criado em outro banco de dados de serviço, se desejado.

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');    

O procedimento armazenado também permite que qualquer membro de um grupo especificado inicie um trabalho, pois ele usa IS_MEMBERpara verificar a associação ao grupo.

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;

Como você pode ver, o procedimento depende da execução como sysadminem msdb. Ao alternar para o contexto do, ORIGINAL_LOGINele pode usar IS_MEMBERpara verificar ORIGINAL_LOGINse realmente foram concedidos direitos através da dbo.msdbJobMaptabela. Depois, volta a ser sysadminpara que possa começar o trabalho.

RLF
fonte
3
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdbera tudo o que eu realmente precisava (embora o código que você postou pareça útil). O usuário é confiável para executar qualquer trabalho. Muito obrigado!
Cruncher
11
Este código é incrivelmente útil. O SQLAgentOperatorRole é excessivamente amplo quando você deseja que um usuário tenha acesso a um ou dois trabalhos.
Steve Mangiameli