获得xp_cmdshell的执行权限

时间:2010-01-06 22:13:51

标签: sql-server database xp-cmdshell

尝试从存储过程中执行xp_cmdshell时,我看到一条错误消息。

实例上的

xp_cmdshell 已启用。并且已授予执行权限给我的用户,但我仍然看到异常。

对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'

上的EXECUTE权限被拒绝

问题的一部分是这是一个共享集群,我们在实例上有一个数据库,因此我们没有完整的管理员权限。所以我不能进入并授予权限,以及什么不是。

6 个答案:

答案 0 :(得分:55)

对于不是SQL Server实例上sysadmin角色成员的用户,您需要执行以下操作以授予对xp_cmdshell扩展存储过程的访问权限。此外,如果您忘记了我已列出将要抛出的错误的其中一个步骤。

  1. 启用xp_cmdshell过程

      

    Msg 15281,Level 16,State 1,Procedure xp_cmdshell,Line 1   SQL Server阻止访问组件“xp_cmdshell”的过程“sys.xp_cmdshell”,因为此组件已作为此服务器的安全配置的一部分关闭。系统管理员可以使用sp_configure启用“xp_cmdshell”。有关启用“xp_cmdshell”的详细信息,请参阅SQL Server联机丛书中的“表面区域配置”。*

  2. 为具有对master数据库的公共访问权限的非sysadmin用户创建登录

      

    Msg 229,Level 14,State 5,Procedure xp_cmdshell,Line 1   对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝。*

  3. 为xp_cmdshell存储过程授予EXEC权限

      

    Msg 229,Level 14,State 5,Procedure xp_cmdshell,Line 1   对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝。*

  4. 创建一个代理帐户,使用sp_xp_cmdshell_proxy_account

    运行xp_cmdshell
      

    消息15153,级别16,状态1,过程xp_cmdshell,第1行   无法检索xp_cmdshell代理帐户信息或该信息无效。验证'## xp_cmdshell_proxy_account ##'凭证是否存在且包含有效信息。*

  5. 从你的错误看,似乎错过了第2步或第3步。我不熟悉群集,知道该设置是否有任何特殊之处。

答案 1 :(得分:44)

我想完成tchester的答案。

(1)启用xp_cmdshell过程:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO

-- Enable the xp_cmdshell procedure
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO

(2)为具有对master数据库的公共访问权限的非sysadmin用户创建登录“Domain \ TestUser”(windows用户)

(3)对xp_cmdshell存储过程授予EXEC权限:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]

(4)创建一个代理帐户,使用sp_xp_cmdshell_proxy_account

运行xp_cmdshell
EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'pwd'
-- Note: pwd means windows password for [Domain\TestUser] account id on the box.
--       Don't include square brackets around Domain\TestUser.

(5)向用户授予控制服务器权限

USE master;
GRANT CONTROL SERVER TO [Domain\TestUser]
GO

答案 2 :(得分:1)

切斯特说:

(2)为具有对master数据库的公共访问权限的非sysadmin用户创建登录名

我访问了我的用户的数据库列表(服务器/安全/连接/我的用户名/属性/用户映射,并且想要检查主数据库的框。我收到一条错误消息,告知用户已存在于主数据库中数据库。去掌握数据库,放弃用户,回到“用户映射”并选中主人的框。检查下面的“公共”框。

之后,您需要将xp_cmdshell上的grant grant重新发布为“我的用户名”

伊夫

答案 3 :(得分:0)

扩展通过SQL Server代理自动将数据作为csv导出到网络共享的内容。

(1)启用xp_cmdshell过程:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO

-- Enable the xp_cmdshell procedure
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO

(2)创建一个登录' Domain \ TestUser' (windows用户)用于具有对master数据库的公共访问权限的非sysadmin用户。完成用户映射

(3)以批处理作业登录:导航到本地安全策略 - >本地政策 - >用户权利分配。将用户添加到"作为批处理作业登录"

(4)为domain \ user

提供网络文件夹的读/写权限

(5)对xp_cmdshell存储过程授予EXEC权限:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]

(6)创建一个代理帐户,使用sp_xp_cmdshell_proxy_account

运行xp_cmdshell
EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user'

(7)如果sp_xp_cmdshell_proxy_account命令不起作用,请手动创建

create credential ##xp_cmdshell_proxy_account## with identity = 'Domain\DomainUser', secret = 'password'

(8)启用SQL Server代理。打开SQL Server配置管理器,导航到SQL Server服务,启用SQL Server代理。

(9)创建自动化作业。打开SSMS,选择SQL Server Agent,然后右键单击作业并单击" New Job"。

(10)选择"所有者"作为您创建的用户。选择"步骤",制作"键入" = T-SQL。填写类似于下面的命令字段。将分隔符设置为','

EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s "," 

(11)相应地填写时间表。

答案 4 :(得分:0)

该做出贡献了。我是sysadmin角色,致力于让两个公共访问用户执行xp_cmdshell。我可以执行xp_cmdshell,但不能执行两个用户。

我执行了以下步骤:

  1. 创建新角色:

    使用母版
    创建角色[CmdShell_Executor]授权[dbo]
    将xp_cmdshell授予[CmdShell_Executor]

  2. 在主数据库中添加用户:安全->用户。成员资格仅检查刚刚创建的[CmdShell_Executor]

  3. 设置代理帐户:

    EXEC sp_xp_cmdshell_proxy_account'domain \ user1','users1 Windows密码'
    EXEC sp_xp_cmdshell_proxy_account'domain \ user2','users2 Windows密码'

然后,两个用户都可以执行包含xp_cmdshell的存储过程,并调用R脚本运行。我让用户来到我的电脑上输入密码,执行一个代码行,然后删除密码。

答案 5 :(得分:-1)

不要将控制权授予用户,这完全没有必要。 对数据库的选择权限就足够了。 创建登录名和主用户后(请参见上述答案):

use YourDatabase
go
create user [YourDomain\YourUser] for login [YourDomain\YourUser] with default_schema=[dbo]
go
alter role [db_datareader] add member [YourDomain\YourUser]
go