Включить 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.
вы выполнили следующую команду.
![введите описание изображения здесь]()