Включить «xp_cmdshell» SQL Server


177

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

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

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

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

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

Ответы:


370

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

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
Работает действительно, ну просто и эффективно!
Indofraiser

2
Убедитесь, что вы запустили SQL Management Studio от имени администратора
Хаим Раман,

Спасибо за такую ​​большую помощь. Ищем решение по дням.
Мохан Раджпут

2
Безопасность - включите, но будьте осторожны! имейте в виду: это
Сойер

39

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

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

19

Щелкните правой кнопкой мыши по серверу -> Грани -> Конфигурация поверхности -> XPCmshellEnbled -> true введите описание изображения здесь


9

Как указано в других ответах, хитрость (в 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 год).


4

Хотя принятый ответ будет работать в большинстве случаев, я сталкивался (до сих пор не знаю, почему) с некоторыми случаями, которые не работают. Небольшая модификация запроса с использованием WITH OVERRIDEin 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 для установки.


4

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

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

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

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

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


0

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

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

-1

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


2
Можете ли вы показать, как этот ответ отличается от других ответов на этот вопрос. Также, пожалуйста, используйте блок кода для вашего кода вместо скриншота.
Атафуд

c: \> sqlcmd -S. -E 1) EXEC sp_con \
arnav
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.