34

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

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

对象“xp_cmdshell”、数据库“mssqlsystemresource”、架构“sys”的执行权限被拒绝</p>

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

4

6 回答 6

61

对于不是 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”的执行权限被拒绝。*

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

    消息 229,级别 14,状态 5,过程 xp_cmdshell,第 1 行对象“xp_cmdshell”、数据库“mssqlsystemresource”、模式“sys”的执行权限被拒绝。*

  4. 使用 sp_xp_cmdshell_proxy_account 创建 xp_cmdshell 将在其下运行的代理帐户

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

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

于 2010-01-08T16:25:54.147 回答
51

我想完成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
于 2012-11-28T13:12:35.097 回答
1

切斯特 说:

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

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

之后,您需要将 xp_cmdshell 上的授权执行重新发出到“我的用户名”

伊夫

于 2012-09-17T17:08:21.107 回答
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) 授予域\用户对网络文件夹的读/写权限

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

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

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

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

于 2018-03-06T20:23:53.757 回答
0

现在是时候做出贡献了。我是系统管理员角色,致力于让两个公共访问用户执行 xp_cmdshell。我能够执行 xp_cmdshell 但不能执行两个用户。

我做了以下步骤:

  1. 创建新角色:

    使用 master
    CREATE ROLE [CmdShell_Executor] AUTHORIZATION [dbo]
    GRANT EXEC ON xp_cmdshell TO [CmdShell_Executor]

  2. 在 master 数据库中添加用户:安全性 --> 用户。成员资格仅检查刚刚创建的 [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 脚本运行的存储过程。我让用户来我的电脑输入密码,执行一行代码,然后删除密码。

于 2019-08-23T03:14:50.017 回答
-1

Don't grant control to the user, it's totally unnecessay. Select permission on the database is enough. After you have created the login and the user on master (see above answers):

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
于 2020-05-02T20:12:21.423 回答