获得xp_cmdshell的执行权限

问题描述 投票:32回答:4

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

在实例上启用了xp_cmdshell。执行权限已授予我的用户,但我仍然看到异常。

对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝

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

sql-server database xp-cmdshell
4个回答
55
投票

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

  1. 启用xp_cmdshell过程 消息15281,级别16,状态1,过程xp_cmdshell,第1行SQL Server阻止访问组件'xp_cmdshell'的过程'sys.xp_cmdshell',因为此组件作为此服务器的安全配置的一部分被关闭。系统管理员可以使用sp_configure启用“xp_cmdshell”。有关启用“xp_cmdshell”的详细信息,请参阅SQL Server联机丛书中的“表面区域配置”。*
  2. 为具有master数据库公共访问权限的非sysadmin用户创建登录名 消息229,级别14,状态5,过程xp_cmdshell,第1行对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝。*
  3. 授予xp_cmdshell存储过程的EXEC权限 消息229,级别14,状态5,过程xp_cmdshell,第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 ##'凭据是否存在且包含有效信息。*

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


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

1
投票

特切斯特说:

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

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

之后,您需要在xp_cmdshell上重新发出grant grant to“my user name”

伊夫


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)为具有对master数据库的公共访问权限的非sysadmin用户创建登录“Domain \ TestUser”(windows用户)。通过用户映射完成

(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代理”,然后右键单击“作业”并单击“新建作业”。

(10)选择“所有者”作为您创建的用户。选择“Steps”,使“type”= T-SQL。填写类似于下面的命令字段。将分隔符设置为“,”

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

(11)相应填写时间表。

© www.soinside.com 2019 - 2024. All rights reserved.