Разрешить не-сисадмину, не являющемуся владельцем задания агента SQL Server, выполнять его

9

У меня есть работа, которая запускает пакет служб SSIS.

В настоящее время владельцем является прокси-аккаунт. Я могу запустить работу вручную из учетной записи sys-admin.

Наш веб-сервис регистрируется с использованием ограниченной учетной записи. Это должно выполнить работу. В настоящее время он вообще не может видеть задание (когда я пытаюсь выполнить по имени, оно говорит, что оно не существует).

Я пытался сменить владельца на ограниченную учетную запись. Теперь он мог видеть задание, но задание не удалось выполнить, потому что он больше не может запускать пакет служб SSIS.

Должен быть способ разрешить ограниченной учетной записи запускать работу, принадлежащую другой учетной записи, верно?

Cruncher
источник

Ответы:

17

Можно настроить метод для предоставления прав на выполнение задания, для которого у пользователя недостаточно прав для самостоятельного запуска.

РЕДАКТИРОВАТЬ: Для ясности в трех представленных опциях, явно упомянув SQLAgentOperatorRole в качестве опции и добавив некоторые пояснения по третьему решению.

(1) Если пользователю разрешено управлять выполнением всех заданий, сделайте этого пользователя членом SQLAgentOperatorRole. Пользователь сможет запускать (а также останавливать, включать и отключать) любое задание агента SQL на этом сервере. (Оказалось, что это решение удовлетворяло первоначальный вопрос.)

(2) Эрланд Соммарског много писал о том, как предоставлять разрешения с помощью хранимых процедур с использованием контрподписей. У него есть решение по адресу:

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

Ключевой момент здесь является: « Для того, чтобы иметь возможность начать работу , принадлежащую кому - то еще, вы должны быть членом фиксированной роли SQLAgentOperatorRoleв msdbСтартовом должны написать хранимую процедуру , которая вызовы. sp_start_jobДля этой конкретной работы, подписать эту процедуру с сертификатом и затем создайте пользователя из сертификата и сделайте его участником SQLAgentOperatorRole. "

(3) Моим общим решением было создание StartAgentJobхранимой процедуры в msdbбазе данных, позволяющей пользователю запускать задания, принадлежащие кому-то другому.

Для этого требуется таблица для настройки того, кто может выполнять какое задание. Поскольку следующая 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_MEMBERдля проверки того, что ORIGINAL_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все, что мне было нужно (хотя код, который вы разместили, выглядит полезным). Пользователь может выполнять любую работу. Большое спасибо!
Cruncher
1
Этот код невероятно полезен. SQLAgentOperatorRole слишком широк, если вы хотите, чтобы пользователь имел доступ к одному или двум заданиям.
Стив Мангиамели