Sql server SQL Server-在多个查询中启用和禁用xp_cmdshell是否可能是有害的?

Sql server SQL Server-在多个查询中启用和禁用xp_cmdshell是否可能是有害的?,sql-server,xp-cmdshell,Sql Server,Xp Cmdshell,我目前在我的一个客户机SQL Server环境下工作。一年前,我被要求在我正在制定的维护计划中实现.csv报告生成。为此,我在服务器上启用了xp_cmdshell选项,并使用了bcp实用程序。但是,另一家公司的程序员最近添加了一个存储过程,在该过程中,他在过程的开头启用xp_cmdshell选项,并在过程的结尾禁用它(设置为0)。此功能导致我的维护计划在报告生成步骤失败 因为我不允许更改他的代码,所以要求我在脚本中包含类似的启用/禁用功能。下面是我找到并使用的代码示例: declare @pre

我目前在我的一个客户机SQL Server环境下工作。一年前,我被要求在我正在制定的维护计划中实现.csv报告生成。为此,我在服务器上启用了xp_cmdshell选项,并使用了bcp实用程序。但是,另一家公司的程序员最近添加了一个存储过程,在该过程中,他在过程的开头启用xp_cmdshell选项,并在过程的结尾禁用它(设置为0)。此功能导致我的维护计划在报告生成步骤失败

因为我不允许更改他的代码,所以要求我在脚本中包含类似的启用/禁用功能。下面是我找到并使用的代码示例:

declare @prevAdvancedOptions int;
declare @prevXpCmdshell int;

select @prevAdvancedOptions = cast(value_in_use as int) from sys.configurations where name = 'show advanced options';
select @prevXpCmdshell = cast(value_in_use as int) from sys.configurations where name = 'xp_cmdshell';

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 1;
    reconfigure;
end;

if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 1;
    reconfigure;
end;


--- doing some work here ---


if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 0;
    reconfigure;
end;

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 0;
    reconfigure;
end;
问题是我不能完全确定这个解决方案的安全性,但我不想重新设计我编写的代码。我还在其他一些脚本中使用xp_cmdshell功能

问题是:当脚本A(由我的维护计划使用)同时执行时,禁用脚本B(在存储过程中使用)中的xp_cmdshell是否会影响脚本A(由我的维护计划使用)的执行

我对SQL Server查询处理器做了一些研究,以了解它是如何工作和执行查询的,但没有找到这个问题的答案


我将感谢你的任何建议

这可能是有害的。时期为什么要这么做?为什么在服务器内部使用
bcp
?为什么不使用SQL Server代理或SSIS?您不需要bcp将数据导出到文件
xp\u cmdshell
如果管理得当,则不会带来额外的安全风险。根据特定代码段是否正在运行,有选择地旋转该选项会增加复杂性,但不会增加安全性--
xp\u cmdshell
所带来的任何安全风险都可能被攻击者通过等待启用的时刻加以利用。我知道这不是你要改变的代码,但另一个人还是错了。这是对一个局部问题应用全局解决方案,会带来很多麻烦。直接回答你的问题:是的,如果有多段代码在开关它,并且期望其中一段是这样,你就会遇到问题。这是该选项作为服务器级选项的一个简单结果。在任何给定的时间点上,它对每个人都是开或关的。您不需要了解查询处理器的内部结构,就可以意识到这是有问题的。如果确实需要
xp\u cmdshell
(这应该首先建立),那么应该使用代理帐户管理其权限。如果您需要临时访问,可以通过临时授予SQL accounts执行
xp\u cmdshell
的权限(然后撤消此权限),在本地安排此操作。事件帐户本身可以是临时的,尽管这需要更多的工作来设置。这些安全层比切换全局选项有效得多,而且它们不会导致脚本相互冲突。有很多方法可以在不削弱安全性的情况下导出数据。您可以将查询步骤添加到代理作业,并将输出定向到文件。您可以使用导出向导快速创建可以重用的SSIS包。或者您可以使用SSDT转换数据并将其导出到任何东西,从CSV到另一个数据库再到Hadoop