Sql-Server-2014

允許兩個使用者執行單個代理作業的權限

  • August 23, 2019

我試圖讓兩個使用者執行一個代理作業。考慮到這一點,我不想將使用者添加到SQLAgentOperatorRolemsdb 中的角色,因為這會給他們額外的特權。

我嘗試創建一個儲存過程,它將作為所有者(dbo)執行:

創建儲存過程(使用 sysadmin 帳戶登錄)

CREATE LOGIN [UnPriveleged] WITH PASSWORD = 'MyPassword'
GO

USE AdventureWorks2017
GO

CREATE USER UnPriveleged FOR LOGIN [UnPriveleged]
GO

CREATE PROCEDURE spRunJOb
WITH EXECUTE AS OWNER
AS
      SELECT CURRENT_USER
      SELECT SYSTEM_USER
      EXEC msdb..sp_start_job @job_name = 'test'
GO

GRANT EXECUTE ON spRunJOb TO UnPriveleged

然後我在另一個會話中以 Unpriveleged 使用者身份執行它:

SELECT CURRENT_USER
EXECUTE [spRunJOb]

我得到一個錯誤

Msg 229, Level 14, State 5, Procedure msdb..sp_start_job, Line 1 [Batch Start Line 0]
The EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.

我認為這將作為儲存過程(sa)所有者的登錄名執行,因為它是系統管理員,應該能夠做所有事情。

我從選擇中獲得的輸出確認該過程正在以 sa 系統使用者身份執行。整體 SELECT 輸出為

Unpriveleged
dbo
sa

我怎樣才能在這裡實現我想要的?

這裡的問題是跨數據庫所有權連結,基本上一旦您離開 AdventureWorks 數據庫的上下文,您就沒有 dbo/sa 所暗示的提升權限,也無法在 msdb 中實際執行該過程。

您應該改為在 msdb 中重新創建儲存過程,並授予非特權使用者對 msdb 的 CONNECT 權限和對 msdb 中新過程的 EXECUTE 權限。

或者,您可以為 AdventureWorks 數據庫打開 TRUSTWORTHY,但通常這是不明智的。請參閱Aaron Bertrand 的此答案以獲取更多資訊以及許多解釋 TRUSTWORTHY 風險的重要連結。

引用自:https://dba.stackexchange.com/questions/246036