尝试从存储过程中执行xp_cmdshell时,我看到一条错误消息。
实例上的xp_cmdshell 已启用。并且已授予执行权限给我的用户,但我仍然看到异常。
对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'
上的EXECUTE权限被拒绝问题的一部分是这是一个共享集群,我们在实例上有一个数据库,因此我们没有完整的管理员权限。所以我不能进入并授予权限,以及什么不是。
答案 0 :(得分:55)
对于不是SQL Server实例上sysadmin角色成员的用户,您需要执行以下操作以授予对xp_cmdshell扩展存储过程的访问权限。此外,如果您忘记了我已列出将要抛出的错误的其中一个步骤。
启用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联机丛书中的“表面区域配置”。*
为具有对master数据库的公共访问权限的非sysadmin用户创建登录
Msg 229,Level 14,State 5,Procedure xp_cmdshell,Line 1 对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝。*
为xp_cmdshell存储过程授予EXEC权限
Msg 229,Level 14,State 5,Procedure xp_cmdshell,Line 1 对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝。*
创建一个代理帐户,使用sp_xp_cmdshell_proxy_account
运行xp_cmdshell消息15153,级别16,状态1,过程xp_cmdshell,第1行 无法检索xp_cmdshell代理帐户信息或该信息无效。验证'## xp_cmdshell_proxy_account ##'凭证是否存在且包含有效信息。*
从你的错误看,似乎错过了第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_cmdshellEXEC 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_cmdshellEXEC 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,但不能执行两个用户。
我执行了以下步骤:
创建新角色:
使用母版
创建角色[CmdShell_Executor]授权[dbo]
将xp_cmdshell授予[CmdShell_Executor]
在主数据库中添加用户:安全->用户。成员资格仅检查刚刚创建的[CmdShell_Executor]
设置代理帐户:
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