Habilite el servidor SQL 'xp_cmdshell'


177

Quiero ejecutar EXEC master..xp_cmdshell @bcpquery

Pero recibo el siguiente error:

SQL Server bloqueó el acceso al procedimiento 'sys.xp_cmdshell' del componente 'xp_cmdshell' porque este componente está desactivado como parte de la configuración de seguridad de este servidor. Un administrador del sistema puede habilitar el uso de 'xp_cmdshell' usando sp_configure. Para obtener más información sobre cómo habilitar 'xp_cmdshell', consulte "Configuración del área de superficie" en los Libros en pantalla de SQL Server.

¿Hay alguna forma de activar esto o ejecutar algo antes de habilitar la función?

¿Cómo resolverlo?

Respuestas:


370

Necesitas habilitarlo. Consulte la sección Permiso de los documentos xp_cmdshell MSDN :

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
Funciona realmente, bien simple y efectivo!
2015

2
Asegúrese de ejecutar SQL Management Studio como administrador
Haim Raman

Gracias por tanta ayuda. Buscando la solución por días.
Mohan Rajput

2
seguridad - ¡Habilite pero tenga cuidado! tenga en cuenta: esto
aserrador

39

También puede ocultar nuevamente la opción avanzada después de reconfigurar:

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

Haga clic derecho en el servidor -> Facetas -> Configuración del área de superficie -> XPCmshellEnbled -> true ingrese la descripción de la imagen aquí


9

Como se enumera en otras respuestas, el truco (en SQL 2005 o posterior) es cambiar la configuración global para show advanced optionsy xp_cmdshellpara 1, en ese orden.

Además de esto, si desea conservar los valores anteriores, puede leerlos desde el sys.configurationsprincipio y luego aplicarlos en orden inverso al final. También podemos evitar reconfigurellamadas innecesarias :

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

Tenga en cuenta que esto se basa en SQL Server versión 2005 o posterior (la pregunta original era para 2008).


4

Si bien la respuesta aceptada funcionará la mayoría de las veces, he encontrado (todavía no sé por qué) algunos casos que no. Una ligera modificación de la consulta mediante el uso de WITH OVERRIDEin RECONFIGUREda la solución

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

La salida esperada es

La opción de configuración 'mostrar opciones avanzadas' cambió de 0 a 1. Ejecute la instrucción RECONFIGURE para instalar.
La opción de configuración 'xp_cmdshell' cambió de 0 a 1. Ejecute la instrucción RECONFIGURE para instalar.


4

Incluso si esta pregunta se ha resuelto, quiero agregar mi consejo al respecto ... ya que como desarrollador lo ignoré.

Es importante saber que estamos hablando de que MSSQL xp_cmdshell habilitado es crítico para la seguridad, como se indica en el mensaje de advertencia:

Blockquote SQL Server bloqueó el acceso al procedimiento 'sys.xp_cmdshell' del componente 'xp_cmdshell' porque este componente está desactivado como parte de la configuración de seguridad de este servidor. [...]

Dejar el servicio habilitado es un tipo de debilidad que, por ejemplo, en una aplicación web podría reflejar y ejecutar comandos SQL de un atacante. El popular CWE-89 : SQL Injectionpodría ser una debilidad en nuestro software y, por lo tanto, este tipo de escenarios podría allanar el camino a posibles ataques, como CAPEC-108 :Command Line Execution through SQL Injection

¡Espero haber hecho algo agradable, nosotros, los Desarrolladores y el Ingeniero, hacemos las cosas con conciencia y estaremos más seguros!


0

Para mí, la única forma en SQL 2008 R2 fue esta:

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

-1

Puedes hacerlo usando SQLcmd. has ejecutado el siguiente comando. ingrese la descripción de la imagen aquí


2
¿Puede mostrar cómo esta respuesta es diferente de las otras respuestas de esta pregunta? Además, utilice un bloque de código para su código en lugar de una captura de pantalla.
Athafoud

c: \> sqlcmd -S. -E 1) EXEC sp_con \
arnav
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.