Включить SQL Server 'xp_cmdshell'

Я хочу выполнить EXEC master..xp_cmdshell @bcpquery

Но я получаю следующую ошибку:

SQL Server заблокировал доступ к процедуре 'sys.xp_cmdshell' компонента 'xp_cmdshell', поскольку этот компонент отключен как часть конфигурации безопасности для этого сервера. Системный администратор может разрешить использование "xp_cmdshell" с помощью sp_configure. Дополнительные сведения о включении xp_cmdshell см. В разделе "Настройка поверхности" электронной документации по SQL Server.

Есть ли способ активировать это или выполнить что-то перед включением функции?

Как это решить?

Ответ 1

Вам нужно включить его. Ознакомьтесь с разделом "Разрешения" xp_cmdshell MSDN docs:

http://msdn.microsoft.com/en-us/library/ms190693.aspx:

-- 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

Ответ 2

Вы также можете скрыть повторно расширенный параметр после перенастройки:

-- show advanced options
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
-- enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
-- hide advanced options
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO

Ответ 3

Сервер правого клика → Границы → Конфигурация поверхности → XPCmshellEnbled → true введите описание изображения здесь

Ответ 4

Как указано в других ответах, трюк (в SQL 2005 или новее) заключается в изменении глобальных параметров конфигурации для show advanced options и xp_cmdshell до 1 в этом порядке.

Добавьте к этому, если вы хотите сохранить предыдущие значения, сначала вы можете прочитать их из sys.configurations, а затем применить их в обратном порядке порядок в конце. Мы также можем избежать ненужных вызовов reconfigure:

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

/* do work */

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

Обратите внимание, что это зависит от SQL Server версии 2005 или более поздней версии (исходный вопрос был за 2008 год).

Ответ 5

В то время как принятый ответ будет работать большую часть времени, я столкнулся (до сих пор не знаю почему), в некоторых случаях это не так. Небольшая модификация запроса с помощью WITH OVERRIDE в RECONFIGURE дает решение

Use Master
GO

EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO

EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

Ожидаемый результат:

Параметр конфигурации "показать дополнительные параметры" изменен с 0 на 1. Запустите инструкцию RECONFIGURE для установки.
Параметр конфигурации "xp_cmdshell" изменился с 0 на 1. Запустите инструкцию RECONFIGURE для установки.

Ответ 6

Для меня единственным способом на SQL 2008 R2 было следующее:

EXEC sp_configure 'Show Advanced Options', 1    
RECONFIGURE **WITH OVERRIDE**    
EXEC sp_configure 'xp_cmdshell', 1    
RECONFIGURE **WITH OVERRIDE**

Ответ 7

Даже если этот вопрос разрешен, я хочу добавить свой совет по этому поводу…, поскольку как разработчик я проигнорировал.

Важно знать, что мы говорим о включенном MSSQL xp_cmdshell, который имеет решающее значение для безопасности, как указано в предупреждении:

Цитата SQL Server заблокировала доступ к процедуре 'sys.xp_cmdshell' компонента 'xp_cmdshell', поскольку этот компонент отключен как часть конфигурации безопасности для этого сервера. [...]

Оставление службы включенной является своего рода слабостью, которая, например, в веб-приложении может отражать и выполнять команды SQL от злоумышленника. Популярный CWE-89: SQL Injection может быть слабым местом в нашем программном обеспечении, и поэтому сценарии такого типа могут проложить путь к возможным атакам, таким как CAPEC-108: Command Line Execution through SQL Injection

Я надеюсь сделать что-то приятное, мы, разработчики и инженеры, делаем вещи с осознанием, и мы будем в большей безопасности!

Ответ 8

Вы можете использовать SQLcmd. вы выполнили следующую команду. введите описание изображения здесь