【问题标题】:Grant role to exec stored procedures授予执行存储过程的角色
【发布时间】:2020-01-04 00:15:55
【问题描述】:

我有一个代理用户,我正试图将其添加到一个可以执行所有存储过程的角色中。使用其他 StackOverflow 帖子,我已经能够将这个脚本放在一起

USE abc

Create ROLE db_exec
go

GRANT EXECUTE TO db_exec
go

EXEC sp_addrolemember 'db_exec', 'abc_user'
go

但是,当我尝试运行我的存储过程时,根据我的错误处理,我仍然收到此错误。

对象“sp_OACreate”、数据库“mssqlsystemresource”、架构“sys”的执行权限被拒绝。

我该怎么做才能让abc_user 执行sp_OACreate

【问题讨论】:

  • sp_OACreate:需要 sysadmin 固定服务器角色的成员身份。
  • @AlexK。我已将用户添加到 sysadmin 并使用 select is_srvrolemember('sysadmin', 'abc_user') 验证返回 1 但我仍然遇到同样的错误,有什么想法吗?
  • 它还需要启用 ole 自动化,您也可以在该实例中收到此错误。最后.....尽量避免 SQL Server 中的 ole 自动化。是DB服务器,不是APP服务器。

标签: sql-server tsql stored-procedures


【解决方案1】:

除了作为系统管理员角色之外,您还需要在这些过程实际驻留的主数据库上授予执行权限

use master
go

grant exec on sp_OACreate to abc_user
GO

运行后,您可以通过以下方式验证您是否有权执行该过程

SELECT * 
FROM master.sys.database_permissions [dp] 
JOIN master.sys.system_objects [so] ON dp.major_id = so.object_id
JOIN master.sys.sysusers [usr] ON 
     usr.uid = dp.grantee_principal_id AND usr.name = 'abc_user'
WHERE permission_name = 'EXECUTE' AND so.name = 'sp_OACreate'

【讨论】:

  • 如果你遇到“找不到用户‘abc_user’,因为它不存在或者你没有权限。”在数据库 master 上时,解决方法是也为 master 中的登录创建用户:“create user abc_user for login abc_user;”
【解决方案2】:

给出的答案是可行的,但是,我们通常尽量不向 any 用户授予系统管理员权限。在这种情况下,我发现运行 sp_OACreate 你实际上并不需要 sysadmin 角色。

我运行了以下内容:

use master
grant exec on sp_OACreate to yourSecObject
grant exec on sp_OADestroy to yourSecObject  --Optional
grant exec on sp_OAMethod to yourSecObject

出于我的目的,我需要一个清理步骤,因此用户需要 Create 和 Destroy。

我希望这可以帮助任何想要提供运行这些程序的能力但不希望用户拥有对服务器上所有其他数据库的完全数据库访问权限的人。

-斯科特

【讨论】:

    【解决方案3】:

    如果有帮助,proc 位于 master > Programmability > Extended Stored Procedures > System Extended Stored Procedures。

    【讨论】:

      【解决方案4】:

      如果出现以下错误:

      The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.
      The EXECUTE permission was denied on the object 'sp_OACreate', database 'mssqlsystemresource', schema 'sys'.
      The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
      The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
      The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
      The EXECUTE permission was denied on the object 'sp_OAGetProperty', database 'mssqlsystemresource', schema 'sys'.
      The EXECUTE permission was denied on the object 'sp_OAGetProperty', database 'mssqlsystemresource', schema 'sys'.
      The EXECUTE permission was denied on the object 'sp_OADestroy', database 'mssqlsystemresource', schema 'sys'.
      

      启用 xp_cmdshell 过程

      此时可能已经执行完毕,仅供参考:

      EXEC sp_configure 'show advanced options', 1
      GO
      RECONFIGURE
      GO
      EXEC sp_configure 'xp_cmdshell', 1
      GO
      EXEC sp_configure 'show advanced options', 0
      GO
      RECONFIGURE
      GO
      

      允许用户执行存储过程

      use [master]
      GO
      
      GRANT EXECUTE ON [sys].[xp_cmdshell] TO [DOMAIN\username];
      GRANT EXECUTE ON [sys].[sp_OACreate] TO [DOMAIN\username];
      GRANT EXECUTE ON [sys].[sp_OADestroy] TO [DOMAIN\username];
      GRANT EXECUTE ON [sys].[sp_OAGetErrorInfo] TO [DOMAIN\username];
      GRANT EXECUTE ON [sys].[sp_OAGetProperty] TO [DOMAIN\username];
      GRANT EXECUTE ON [sys].[sp_OAMethod] TO [DOMAIN\username];
      GRANT EXECUTE ON [sys].[sp_OAStop] TO [DOMAIN\username];
      GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [DOMAIN\username];
      GO
      

      检查是否设置了执行权限

      SELECT * 
      FROM master.sys.database_permissions [dp] 
      JOIN master.sys.system_objects [so] ON dp.major_id = so.object_id
      JOIN master.sys.sysusers [usr] ON usr.uid = dp.grantee_principal_id AND usr.name = 'DOMAIN\username'
      WHERE permission_name = 'EXECUTE' 
      AND (so.name = 'xp_cmdshell'
        OR so.name = 'sp_OACreate'
        OR so.name = 'sp_OADestroy'
        OR so.name = 'sp_OAGetErrorInfo'
        OR so.name = 'sp_OAGetProperty'
        OR so.name = 'sp_OAMethod'
        OR so.name = 'sp_OAStop'
        OR so.name = 'sp_OASetProperty')
      

      【讨论】:

        猜你喜欢
        • 2010-11-09
        • 2018-04-07
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 2020-03-16
        • 2021-04-07
        • 2014-08-21
        相关资源
        最近更新 更多