Cho phép người không phải là sysadmin, không phải là chủ sở hữu của tác vụ SQL Server Agent thực thi nó


9

Tôi có một công việc chạy gói SSIS.

Hiện tại chủ sở hữu là một tài khoản proxy. Tôi có thể chạy công việc thủ công từ tài khoản sys-admin.

Dịch vụ web của chúng tôi đăng nhập bằng cách sử dụng một tài khoản hạn chế. Nó cần phải thực hiện công việc. Hiện tại nó không thể nhìn thấy công việc (khi tôi cố gắng thực hiện theo tên, nó nói nó không tồn tại).

Tôi đã cố gắng thay đổi để chủ sở hữu của công việc vào tài khoản hạn chế. Bây giờ nó có thể thấy công việc, nhưng công việc không thực hiện được vì nó không thể chạy gói SSIS nữa.

Có phải là một cách để cho phép tài khoản giới hạn chạy một công việc thuộc sở hữu của một tài khoản khác phải không?

Câu trả lời:


17

Có thể thiết lập một phương thức để cấp quyền để chạy một công việc mà người dùng không có đủ thẩm quyền để tự mình chạy.

EDIT: Để rõ ràng về ba tùy chọn được trình bày bằng cách đề cập rõ ràng SQLAgentOperatorRole như một tùy chọn và bằng cách thêm một số giải thích về giải pháp thứ ba.

(1) Nếu người dùng được phép quản lý việc thực hiện tất cả các công việc, thì hãy tạo thành viên người dùng đó của SQLAgentOperatorRole. Người dùng sẽ có thể bắt đầu (cũng như dừng, bật và tắt) mọi công việc của Tác nhân SQL trên máy chủ đó. (Giải pháp này hóa ra để thỏa mãn người hỏi ban đầu.)

(2) Erland Sommarskog đã viết rất nhiều về cách cấp quyền thông qua các thủ tục được lưu trữ bằng cách sử dụng chữ ký phản đối. Ông có một giải pháp tại:

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

Điểm mấu chốt là: "Để có thể bắt đầu một công việc thuộc sở hữu của người khác, bạn cần phải là thành viên của vai trò cố định SQLAgentOperatorRoletrong msdbMột khởi đầu là viết một thủ tục lưu trữ các cuộc gọi. sp_start_jobCho công việc cụ thể này, ký thủ tục giấy chứng nhận và sau đó tạo người dùng từ chứng chỉ và biến người dùng đó thành thành viên SQLAgentOperatorRole. "

(3) Nghị quyết chung của tôi là tạo ra một StartAgentJobthủ tục được lưu trữ trong msdbcơ sở dữ liệu cho phép người dùng bắt đầu các công việc thuộc sở hữu của người khác.

Điều này đòi hỏi một bảng để duy trì cấu hình của những người có thể chạy công việc nào. Vì dbo.msdbJobMapbảng sau đây là SQL Server Agent cụ thể, tôi sẽ tạo bảng trong msdb. Nhưng nó có thể được tạo trong một số cơ sở dữ liệu dịch vụ khác nếu muốn.

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

Quy trình được lưu trữ cũng cho phép bất kỳ thành viên nào của một nhóm được chỉ định bắt đầu một công việc vì nó sử dụng IS_MEMBERđể kiểm tra tư cách thành viên của nhóm.

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;

Như bạn có thể thấy, thủ tục phụ thuộc vào việc chạy như sysadmintrong msdb. Bằng cách chuyển sang bối cảnh của ORIGINAL_LOGINnó, nó có thể được sử dụng IS_MEMBERđể kiểm tra xem ORIGINAL_LOGINthực sự đã được cấp quyền thông qua dbo.msdbJobMapbảng chưa. Sau đó, nó trở lại để sysadmincó thể bắt đầu công việc.


3
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdblà tất cả những gì tôi cần thực sự (mặc dù mã bạn đăng có vẻ hữu ích). Người dùng được tin tưởng để chạy bất kỳ công việc. Cảm ơn rất nhiều!
Cruncher

1
Mã này là vô cùng hữu ích. SQLAgentOperatorRole quá rộng khi bạn muốn người dùng có quyền truy cập vào một hoặc hai công việc.
Steve Mangiameli
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.