如何从SQL Server 2005的用户数据库中的存储过程执行msdb.dbo.sp_start_job

我试图从MyDB.dbo.MyStoredProc执行一个msdb.dbo.sp_start_Job为了执行MyJob

1)我知道,如果我给用户一个SqlAgentUserangular色,他将能够运行他拥有的工作(但这是我观察到的:用户可以开始/停止/重新启动SQL代理,所以我不想去这个路线) – 让我知道如果我错了,但我不明白为什么这样一个低权限的用户能够启动/停止代理。

2)我知道,如果我给予执行权限执行用户到msdb.dbo.Sp_Start_job和启用所有权链接或启用可信用户数据库它会工作(但我不希望在用户数据库启用所有权链接或信任)

3)我这可以通过代码签名来完成

用户数据库 i)创build存储过程MyDB.dbo.MyStoredProc ii)创build一个certificae job_exec iii)用证书job_exec签名MyDB.dbo.MyStoredProc iv)导出证书

msdb i)导入证书ii)从这个证书创build一个派生用户iii)为这个派生用户授予authenticationiv)在msdb.dbo.sp_start_job上向派生用户授予执行权v)在msdb.dbo.sp_start_job上向执行的用户授予执行权MyDB.dbo.MyStoredProc

但我试了一下,它不适合我 – 我不知道我失踪或做错了哪一块

所以请为我提供一个简单的示例(使用脚本),使用代码签名从用户存储的prod MyDB.dbo.MyStoredProc中执行msdb.dbo.sp_start_job

许多许多人提前感谢

谢谢拉姆

1)我认为SSMS正在做一些可能被认为是“function”的东西。 你的观察是,SSMS允许你重新启动SQL Server代理与你的Windows权限,无论你在SQL Server中拥有什么权限,或者你在对象资源pipe理器中login到服务器的权限,例如。 我创build了一个只有MSDB中的SqlAgentUserangular色的SQL帐户,并能够重新启动代理,尽pipe我作为本地pipe理员启动了SSMS。

我试图做同样的事情,虽然我创build了一个本地的Windows用户帐户&启动SSMS使用运行为..作为本地非pipe理员用户。 我发现我无法阻止代理,事实上,当我试过(哦,亲爱的!),但代理不断运行,SSMS崩溃。 …所以这个故事的寓意是,确保你只希望能够运行特定作业的用户不是你的SQL Server框上的本地pipe理员。 如果是的话,那么他们已经可以重启代理了,SQL Server就这么重要! 所以放弃你的压力!

2)你可以做一些事情,比如创build你自己的叫做msdb.dbo.sp_start_job @yourjobid的sproc,并在这个sproc中使用EXECUTE AS或者setuser。 然后授予您的用户权限只有该sproc。

3)你疯了吗?!?!?!

代码签名是这样做的正确方法。 我的描述中唯一缺less的是MyDB.dbo.MyStoredProc 必须具有EXECUTE AS子句(即使是EXECUTE AS CALLER),否则代码签名不会生效。

Jonathan Kehayias已经发布了一个解决scheme,似乎是一个完美的解决scheme。

看看这个,看看这是否适合你。 http://www.sqlservercentral.com/articles/Security/68873/