为什么xp_cmdshell在SQL Server 2012中不起作用?

7 sql-server sql-server-2012

可能重复:
启用"xp_cmdshell"SQL Server

当我xp_cmdshell在SQL Server 2012中运行命令时,我收到以下消息:

SQL Server阻止访问组件"xp_cmdshell"的过程"sys.xp_cmdshell",因为此组件已作为此服务器的安全配置的一部分关闭.系统管理员可以使用sp_configure启用"xp_cmdshell".有关启用"xp_cmdshell"的详细信息,请在SQL Server联机丛书中搜索"xp_cmdshell".

但是,在SQL Server 2000中,此查询已成功执行.

Aar*_*and 20

从SQL Server 2005开始,当它们引入了Surface Area Configuration Tool时,它已经开箱即用,以便在默认情况下使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
Run Code Online (Sandbox Code Playgroud)

(多年前我也在博客上写过这篇文章.)

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

它不是启用它并禁用它来支持命令行交互,而是在保持对安全性有一定控制的同时公开操作系统功能的一种流行方式是使用SQL-CLR实现所需的操作系统级功能.这是使用CLR访问文件系统的一个很好的起点(但是如果你四处搜索,你会发现更多现代和详尽的方法).