Abilita 'xp_cmdshell' SQL Server


177

Voglio eseguire EXEC master..xp_cmdshell @bcpquery

Ma sto ottenendo il seguente errore:

SQL Server ha bloccato l'accesso alla procedura 'sys.xp_cmdshell' del componente 'xp_cmdshell' perché questo componente è disattivato come parte della configurazione di sicurezza per questo server. Un amministratore di sistema può abilitare l'uso di 'xp_cmdshell' usando sp_configure. Per ulteriori informazioni sull'abilitazione di "xp_cmdshell", vedere "Configurazione dell'area della superficie" nella documentazione online di SQL Server.

C'è un modo per attivarlo o eseguire qualcosa prima di abilitare la funzione?

Come risolverlo?

Risposte:


370

Devi abilitarlo. Dai un'occhiata alla sezione Autorizzazione dei documenti 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
Funziona davvero, molto semplice ed efficace!
indofraiser

2
Assicurati di eseguire SQL Management Studio come amministratore
Haim Raman,

Grazie per l'aiuto così grande. Alla ricerca della soluzione per giorni.
Mohan Rajput,

2
sicurezza - Abilita ma fai attenzione! tenere a mente: questo
sawyer

39

Puoi anche nascondere di nuovo l'opzione avanzata dopo la riconfigurazione:

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

Fare clic con il tasto destro del mouse sul server -> Sfaccettature -> Configurazione dell'area della superficie -> XPCmshellEnbled -> true inserisci qui la descrizione dell'immagine


9

Come elencato in altre risposte, il trucco (in SQL 2005 o versioni successive) consiste nel modificare le impostazioni di configurazione globali per show advanced optionse xp_cmdshellin 1, in quell'ordine.

Aggiungendo a questo, se si desidera preservare i valori precedenti, è possibile leggerli dal sys.configurationsprimo, quindi applicarli in ordine inverso alla fine. Possiamo anche evitare reconfigurechiamate non necessarie :

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

Si noti che questo si basa su SQL Server versione 2005 o successiva (la domanda originale era per il 2008).


4

Mentre la risposta accettata funzionerà la maggior parte delle volte, ho riscontrato (ancora non so perché) alcuni casi che non lo sono. Una leggera modifica della query utilizzando WITH OVERRIDEin RECONFIGUREfornisce la soluzione

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

L'output previsto è

L'opzione di configurazione "mostra opzioni avanzate" è stata modificata da 0 a 1. Eseguire l'installazione dell'istruzione RECONFIGURE.
L'opzione di configurazione 'xp_cmdshell' è stata modificata da 0 a 1. Eseguire l'istruzione RECONFIGURE per l'installazione.


4

Anche se questa domanda si è risolta, voglio aggiungere il mio consiglio al riguardo .... poiché come sviluppatore ho ignorato.

È importante sapere che stiamo parlando di MSSQL xp_cmdshell abilitato è fondamentale per la sicurezza, come indicato nell'avvertimento del messaggio:

Blockquote SQL Server ha bloccato l'accesso alla procedura 'sys.xp_cmdshell' del componente 'xp_cmdshell' perché questo componente è disattivato come parte della configurazione di sicurezza per questo server. [...]

Lasciare il servizio abilitato è un tipo di debolezza , che ad esempio in un'app Web potrebbe riflettere ed eseguire comandi SQL da un utente malintenzionato. Il popolare CWE-89 : SQL Injectionpotrebbe essere un punto debole nel nostro software, e quindi questo tipo di scenari potrebbe aprire la strada a possibili attacchi, come CAPEC-108 :Command Line Execution through SQL Injection

Spero di aver fatto qualcosa di piacevole, noi sviluppatori e ingegneri facciamo le cose con consapevolezza e saremo più sicuri!


0

Per me, l'unico modo su SQL 2008 R2 era questo:

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

-1

Puoi fare usando SQLcmd. hai eseguito il comando seguente. inserisci qui la descrizione dell'immagine


2
Puoi mostrare come questa risposta è diversa dalle altre risposte di questa domanda. Inoltre, utilizzare un blocco di codice per il codice anziché uno screenshot.
Athafoud,

c: \> sqlcmd -S. -E 1) EXEC sp_con \
arnav
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.