Izinkan non-sysadmin, bukan pemilik pekerjaan SQL Server Agent untuk menjalankannya


9

Saya memiliki pekerjaan yang menjalankan paket SSIS.

Saat ini pemiliknya adalah akun proxy. Saya dapat menjalankan pekerjaan secara manual dari akun sys-admin.

Layanan web kami masuk menggunakan akun terbatas. Perlu menjalankan pekerjaan. Saat ini ia tidak dapat melihat pekerjaan sama sekali (ketika saya mencoba mengeksekusi dengan nama, katanya tidak ada).

Saya mencoba mengubah pemilik pekerjaan ke akun terbatas. Sekarang bisa melihat pekerjaan, tetapi pekerjaan gagal dieksekusi karena tidak dapat menjalankan paket SSIS lagi.

Harus ada cara untuk memungkinkan akun terbatas menjalankan pekerjaan yang dimiliki oleh akun lain, kan?

Jawaban:


17

Dimungkinkan untuk mengatur metode untuk memberikan hak untuk menjalankan pekerjaan yang pengguna tidak memiliki cukup otoritas untuk berjalan sendiri.

EDIT: Untuk memperjelas tiga opsi yang disajikan dengan secara eksplisit menyebutkan SQLAgentOperatorRole sebagai opsi dan dengan menambahkan beberapa penjelasan tentang solusi ketiga.

(1) Jika pengguna diizinkan untuk mengelola eksekusi semua pekerjaan, maka buatlah anggota pengguna itu SQLAgentOperatorRole. Pengguna akan dapat memulai (serta menghentikan, mengaktifkan, dan menonaktifkan) pekerjaan SQL Agent di server itu. (Solusi ini ternyata memuaskan penanya yang asli.)

(2) Erland Sommarskog telah menulis banyak tentang cara memberikan izin melalui prosedur tersimpan menggunakan tanda tangan tandingan. Dia punya solusi di:

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

Titik kunci adalah: "Untuk dapat memulai pekerjaan yang dimiliki oleh orang lain, Anda harus anggota dari peran tetap SQLAgentOperatorRoledi msdbAwal adalah untuk menulis prosedur tersimpan bahwa panggilan. sp_start_jobUntuk pekerjaan tertentu, menandatangani prosedur yang dengan sertifikat , lalu buat pengguna dari sertifikat dan jadikan pengguna itu anggota SQLAgentOperatorRole. "

(3) Resolusi umum saya adalah membuat StartAgentJobprosedur tersimpan dalam msdbdatabase yang memungkinkan pengguna untuk memulai pekerjaan yang dimiliki oleh orang lain.

Ini membutuhkan tabel untuk mempertahankan konfigurasi siapa yang dapat menjalankan pekerjaan mana. Karena dbo.msdbJobMaptabel berikut ini adalah SQL Server Agent Job spesifik, saya akan membuat tabel di msdb. Tapi itu bisa dibuat di beberapa basis data layanan lain jika diinginkan.

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

Prosedur tersimpan juga memungkinkan setiap anggota dari kelompok tertentu untuk memulai pekerjaan karena digunakan IS_MEMBERuntuk memeriksa keanggotaan grup.

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;

Seperti yang Anda lihat, prosedurnya tergantung pada menjalankan seperti sysadminpada msdb. Dengan beralih ke konteks ORIGINAL_LOGINitu dapat digunakan IS_MEMBERuntuk memeriksa bahwa ORIGINAL_LOGINmemang telah diberikan hak melalui dbo.msdbJobMaptabel. Kemudian kembali menjadi sysadminsehingga dapat memulai pekerjaan.


3
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdbitu yang saya butuhkan sebenarnya (walaupun kode yang Anda posting terlihat berguna). Pengguna dipercaya untuk menjalankan pekerjaan apa pun. Terima kasih banyak!
Cruncher

1
Kode ini sangat berguna. SQLAgentOperatorRole terlalu luas ketika Anda ingin pengguna memiliki akses ke satu atau dua pekerjaan.
Steve Mangiameli
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.