Habilitar o SQL Server 'xp_cmdshell'


177

Eu quero executar EXEC master..xp_cmdshell @bcpquery

Mas estou recebendo o seguinte erro:

O SQL Server bloqueou o acesso ao procedimento 'sys.xp_cmdshell' do componente 'xp_cmdshell' porque esse componente está desativado como parte da configuração de segurança deste servidor. Um administrador do sistema pode ativar o uso de 'xp_cmdshell' usando sp_configure. Para obter mais informações sobre como habilitar 'xp_cmdshell', consulte "Configuração da área de superfície" nos Manuais Online do SQL Server.

Existe alguma maneira de ativar isso ou executar algo antes de ativar o recurso?

Como resolver isso?

Respostas:


370

Você precisa habilitá-lo. Confira a seção Permissão dos 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, bem simples e eficaz!
Indofraiser

2
Certifique-se de executar SQL Management Studio como administrador
Haim Raman

Obrigado por essa grande ajuda. Procurando a solução por dias.
Mohan Rajput

2
segurança - ative, mas tenha cuidado! lembre-se: this
sawyer

39

Você também pode ocultar novamente a opção avançada após 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

Clique com o botão direito do mouse em servidor -> Facetas -> Configuração da área de superfície -> XPCmshellEnbled -> true insira a descrição da imagem aqui


9

Conforme listado em outras respostas, o truque (no SQL 2005 ou posterior) é alterar as configurações globais de show advanced optionse xp_cmdshellpara1 , nessa ordem.

Além disso, se você deseja preservar os valores anteriores, pode lê-los sys.configurationsprimeiro e aplicá-los na ordem inversa no final. Também podemos evitar reconfigurechamadas desnecessárias :

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

Observe que isso depende do SQL Server versão 2005 ou posterior (a pergunta original era para 2008).


4

Embora a resposta aceita funcione na maioria das vezes, eu encontrei (ainda não sei o porquê) alguns casos que não são. Uma leve modificação da consulta usando o WITH OVERRIDEin RECONFIGUREfornece a solução

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

A saída esperada é

A opção de configuração 'mostrar opções avançadas' foi alterada de 0 para 1. Execute a instrução RECONFIGURE para instalar.
A opção de configuração 'xp_cmdshell' foi alterada de 0 para 1. Execute a instrução RECONFIGURE para instalar.


4

Mesmo que essa pergunta tenha sido resolvida, quero adicionar meus conselhos sobre isso .... pois como desenvolvedor eu ignorei.

É importante saber que estamos falando sobre o MSSQL xp_cmdshell ativado é fundamental para a segurança, conforme indicado no aviso de mensagem:

Citação em bloco O SQL Server bloqueou o acesso ao procedimento 'sys.xp_cmdshell' do componente 'xp_cmdshell' porque esse componente está desativado como parte da configuração de segurança desse servidor. [...]

Deixar o serviço ativado é um tipo de fraqueza que, por exemplo, em um aplicativo Web, pode refletir e executar comandos SQL de um invasor. O popular CWE-89 : SQL Injectionpode ser uma fraqueza no nosso software e, portanto, esse tipo de cenário pode abrir caminho para possíveis ataques, como o CAPEC-108 :Command Line Execution through SQL Injection

Espero ter feito algo agradável, nós desenvolvedores e engenheiros fazemos as coisas com consciência e estaremos mais seguros!


0

Para mim, a única maneira no SQL 2008 R2 era esta:

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

-1

Você pode fazer usando o SQLcmd. você executou o seguinte comando. insira a descrição da imagem aqui


2
Você pode mostrar como essa resposta é diferente das outras respostas desta pergunta. Além disso, use um bloco de código para o seu código em vez de uma captura de tela.
Athafoud 11/04

c: \> sqlcmd -S. Exemplo 1: EXEC sp_con \
arnav
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.