为什么在SQL Server 2012中xp_cmdshell无法工作?

7
当我在SQL Server 2012中运行xp_cmdshell命令时,我收到以下消息: SQL Server阻止访问组件“xp_cmdshell”的过程“sys.xp_cmdshell”,因为此组件作为该服务器的安全配置的一部分已关闭。系统管理员可以使用sp_configure启用对“xp_cmdshell”的使用。有关启用“xp_cmdshell”的更多信息,请在SQL Server Books Online中搜索“xp_cmdshell”。 但是,在SQL Server 2000中,此查询成功执行。

7
自2005年起,默认情况下已禁用此功能。错误消息的哪个部分不清楚? - Martin Smith
2个回答

20

从SQL Server 2005开始,他们引入了表面配置工具,以加强默认情况下 SQL Server 的安全性,因此该功能已被关闭。虽然该工具已经被弃用,但您仍可以使用sp_configure来控制其行为。在MSDN上有一个示例

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO

(我多年前也 写过这方面的博客。)

原因是这是一个潜在的安全漏洞。如果允许 SQL Server 执行 xp_cmdshell,那么它们可以理论上发送到那里的任何操作系统命令,绕过您认为已经具备的所有安全性措施。当 SQL Server 服务帐户和/或代理帐户被提升到 sysadmin 或其他级别时,这尤其有问题,因为这比明确定义它们应该能够执行的准确操作更容易。

与启用和禁用以支持命令行交互相比,一种流行的方法是使用 SQL-CLR 实现您需要的操作系统级别功能,同时仍然对安全性具有一定的控制。这里是 使用 CLR 访问文件系统的良好起点(但是如果您搜索周围,您会发现更现代和详尽的方法)。


3

这在SQL Server 2012中是不可用的。 但您可以在SQL Server 2008中运行以下命令。

EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE

就是这样。自 Server 2012 之前就一直是这样的。记得在过程结束时反转/关闭 xp_cmdshell。 - Danny Beckett
2
这将直接返回错误信息:“配置选项 'xp_cmdshell' 不存在,或者可能是高级选项。” - Martin Smith
@Denny 我不确定在过程中切换它的开/关状态是否是一个好主意。如果两个用户正在运行该过程,这个开/关开关会发生重叠怎么办? - Aaron Bertrand
请参考@AaronBertrand的答案获取完整解决方案。 - Danny Beckett
您可以通过 SQL Server Management Studio 来完成以下操作:右键单击服务器,选择 Facets 选择 Facet Surface Area Configuration 将属性 XPCmdShellEnabled 设置为 True - Vishe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接