xp_cmdshell (Transact-SQL)
Si applica a: SQL Server
Genera una shell dei comandi di Windows e passa una stringa per l'esecuzione. L'eventuale output viene restituito in forma di righe di testo.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
Argomenti
'command_string'
Stringa contenente un comando da passare al sistema operativo. command_string è varchar(8000) o nvarchar(4000), senza impostazione predefinita. command_string non può contenere più di un set di virgolette doppie. È necessaria una singola coppia di virgolette se sono presenti spazi nei percorsi di file o nei nomi dei programmi a cui si fa riferimento in command_string. In caso di problemi nell'utilizzo di spazi incorporati nelle stringhe, valutare l'utilizzo di nomi di file in formato FAT 8.3 come soluzione alternativa.
NO_ OUTPUT
Parametro facoltativo, che specifica che non deve essere restituito alcun output al client.
Valori del codice restituito
0
(esito positivo) o 1
(errore).
Set di risultati
L'istruzione xp_cmdshell
seguente restituisce un elenco dei file con estensione exe contenuti nella directory corrente.
EXEC xp_cmdshell 'dir *.exe';
GO
Le righe vengono restituite in una colonna nvarchar(255). Se viene usata l'opzione NO_OUTPUT
, viene restituito solo l'output seguente:
The command(s) completed successfully.
Osservazioni:
Il processo di Windows generato da xp_cmdshell
ha gli stessi diritti di sicurezza dell'account del servizio SQL Server.
Attenzione
xp_cmdshell
è una funzionalità potente e disabilitata per impostazione predefinita. xp_cmdshell
può essere abilitato e disabilitato tramite la gestione basata su criteri o eseguendo sp_configure
. Per altre informazioni, vedere Configurazione dell'area di attacco e xp_cmdshell (opzione di configurazione del server). L'uso di xp_cmdshell
può attivare gli strumenti di controllo della sicurezza.
xp_cmdshell
opera in modo sincrono. Il controllo non viene restituito al chiamante fino al completamento del comando della shell dei comandi. Se xp_cmdshell
viene eseguito all'interno di un batch e restituisce un errore, il batch avrà esito negativo.
xp_cmdshell account proxy
Quando viene chiamato da un utente che non è membro del ruolo predefinito del server sysadmin , xp_cmdshell
si connette a Windows usando il nome dell'account e la password archiviati nelle credenziali denominate ##xp_cmdshell_proxy_account### . Se questa credenziale proxy non esiste, xp_cmdshell
ha esito negativo.
Le credenziali dell'account proxy possono essere create eseguendo sp_xp_cmdshell_proxy_account
. Questa stored procedure accetta un nome utente e una password di Windows come argomenti. Il comando seguente, ad esempio, crea una credenziale proxy per l'utente di dominio di Windows SHIPPING\KobeR
con la password di Windows sdfh%dkc93vcMt0
.
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';
Per altre informazioni, vedere sp_xp_cmdshell_proxy_account.
Autorizzazioni
Poiché gli utenti malintenzionati a volte tentano di elevare i propri privilegi usando xp_cmdshell
, xp_cmdshell
è disabilitato per impostazione predefinita. Usare sp_configure
o la gestione basata su criteri per abilitarla. Per altre informazioni, vedere Opzione di configurazione del server xp_cmdshell.
Quando è abilitata per la prima volta, xp_cmdshell
è richiesta l'autorizzazione CONTROL SERVER per l'esecuzione e il processo di Windows creato da xp_cmdshell
ha lo stesso contesto di sicurezza dell'account del servizio SQL Server. L'account del servizio SQL Server ha spesso più autorizzazioni di quelle necessarie per il lavoro eseguito dal processo creato da xp_cmdshell
. Per migliorare la sicurezza, l'accesso a xp_cmdshell
deve essere limitato agli utenti con privilegi elevati.
Per consentire agli utenti non amministratori di usare xp_cmdshell
e consentire a SQL Server di creare processi figlio con il token di sicurezza di un account con privilegi minori, seguire questa procedura:
Creare e personalizzare un account utente locale di Windows o un account di dominio con i privilegi minimi richiesti dai processi.
Utilizzare la
sp_xp_cmdshell_proxy_account
procedura di sistema per configurarexp_cmdshell
per usare l'account con privilegi minimi.Nota
È anche possibile configurare questo account proxy usando SQL Server Management Studio facendo clic con il pulsante destro del mouse su Proprietà nel nome del server in Esplora oggetti e cercando nella scheda Sicurezza della sezione Account proxy server.
In Management Studio, usando il
master
database, eseguire l'istruzione Transact-SQL seguente per offrire agli utenti non sysadmin specifici la possibilità di eseguirexp_cmdshell
. L'utente specificato deve esistere nelmaster
database.GRANT exec ON xp_cmdshell TO N'<some_user>';
Ora gli utenti non amministratori possono avviare i processi del sistema operativo con xp_cmdshell
e questi processi vengono eseguiti con le autorizzazioni dell'account proxy configurato. Gli utenti con autorizzazione CONTROL SERVER (membri del ruolo predefinito del server sysadmin ) continuano a ricevere le autorizzazioni dell'account del servizio SQL Server per i processi figlio avviati da xp_cmdshell
.
Per determinare l'account di Windows usato da quando xp_cmdshell
si avviano i processi del sistema operativo, eseguire l'istruzione seguente:
EXEC xp_cmdshell 'whoami.exe';
Per determinare il contesto di sicurezza per un altro account di accesso, eseguire il codice Transact-SQL seguente:
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
Esempi
R. Restituisce un elenco di file eseguibili
Nell'esempio seguente viene mostrato l'utilizzo della stored procedure estesa xp_cmdshell
per eseguire un comando di directory.
EXEC master..xp_cmdshell 'dir *.exe'
B. Non restituisce alcun output
Nell'esempio seguente viene mostrato l'utilizzo di xp_cmdshell
per eseguire una stringa di comandi senza restituire alcun output al client.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. Usare lo stato restituito
Nell'esempio seguente la xp_cmdshell
stored procedure estesa suggerisce anche lo stato restituito. Il valore restituito viene archiviato nella variabile @result
.
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. Scrivere il contenuto delle variabili in un file
Nell'esempio seguente il contenuto della variabile @var
viene scritto in un file denominato var_out.txt
nella directory corrente del server.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXEC master..xp_cmdshell @cmd;
E. Acquisire il risultato di un comando in un file
Nell'esempio seguente il contenuto della directory corrente viene scritto nel file dir_out.txt
nella directory corrente del server.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;