Consentire a non amministratore di sistema, non proprietario di un processo di SQL Server Agent di eseguirlo


9

Ho un lavoro che esegue un pacchetto SSIS.

Attualmente il proprietario è un account proxy. Posso eseguire il lavoro manualmente da un account amministratore di sistema.

Il nostro servizio web accede utilizzando un account limitato. Deve eseguire il lavoro. Attualmente non è in grado di vedere il lavoro (quando provo a eseguire per nome, dice che non esiste).

Ho provato a passare al proprietario del lavoro con l'account limitato. Ora potrebbe vedere il lavoro, ma l'esecuzione del lavoro non è riuscita perché non è più possibile eseguire il pacchetto SSIS.

Ci deve essere un modo per consentire all'account limitato di eseguire un lavoro di proprietà di un altro account, giusto?

Risposte:


17

È possibile impostare un metodo per concedere i diritti per eseguire un lavoro che un utente non dispone dell'autorizzazione sufficiente per eseguire da solo.

EDIT: per chiarezza sulle tre opzioni presentate citando esplicitamente SQLAgentOperatorRole come opzione e aggiungendo alcune spiegazioni sulla terza soluzione.

(1) Se l'utente è autorizzato a gestire l'esecuzione di tutti i lavori, rendere tale utente membro di SQLAgentOperatorRole. L'utente sarà in grado di avviare (nonché arrestare, abilitare e disabilitare) qualsiasi processo di Agente SQL su quel server. (Questa soluzione si è rivelata soddisfacente per il richiedente originale.)

(2) Erland Sommarskog ha scritto molto su come concedere le autorizzazioni attraverso procedure memorizzate che utilizzano controfirme. Ha una soluzione a:

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

Il punto chiave è: "Per poter avviare un lavoro di proprietà di qualcun altro, devi essere membro del ruolo fisso SQLAgentOperatorRolein msdb. Un inizio è scrivere una procedura memorizzata che richiede sp_start_jobquesto lavoro specifico, firmare quella procedura con un certificato e quindi creare un utente dal certificato e renderlo membro di SQLAgentOperatorRole".

(3) La mia risoluzione generale era quella di creare una StartAgentJobprocedura memorizzata nel msdbdatabase che consentisse a un utente di avviare lavori di proprietà di qualcun altro.

Ciò richiede una tabella per mantenere la configurazione di chi può eseguire quale lavoro. Poiché la dbo.msdbJobMaptabella seguente è specifica del lavoro dell'agente di SQL Server, vorrei creare la tabella msdb. Ma potrebbe essere creato in qualche altro database di servizio, se lo si desidera.

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

La procedura memorizzata consente inoltre a qualsiasi membro di un gruppo specificato di avviare un processo poiché viene utilizzato IS_MEMBERper verificare l'appartenenza al gruppo.

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;

Come puoi vedere, la procedura dipende dall'esecuzione come sysadminin msdb. Passando al contesto di ORIGINAL_LOGINesso è in grado IS_MEMBERdi verificare se i ORIGINAL_LOGINdiritti sono stati effettivamente concessi attraverso la dbo.msdbJobMaptabella. Quindi torna ad essere in sysadminmodo che possa iniziare il lavoro.


3
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdbera tutto ciò di cui avevo effettivamente bisogno (anche se il codice che hai pubblicato sembra utile). L'utente ha la fiducia di eseguire qualsiasi lavoro. Molte grazie!
Cruncher,

1
Questo codice è incredibilmente utile. SQLAgentOperatorRole è eccessivamente ampio quando si desidera che un utente abbia accesso a uno o due lavori.
Steve Mangiameli,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.