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 di 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 xp_cmdshell di 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 (Transact-SQL).

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 edizione Standard RVER 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_cmdshelle consentire a SQL Server di creare processi figlio con il token di sicurezza di un account con privilegi minori, seguire questa procedura:

  1. Creare e personalizzare un account utente locale di Windows o un account di dominio con i privilegi minimi richiesti dai processi.

  2. Utilizzare la sp_xp_cmdshell_proxy_account procedura di sistema per configurare xp_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.

  3. In Management Studio, usando il master database, eseguire l'istruzione Transact-SQL seguente per offrire agli utenti non sysadmin specifici la possibilità di eseguire xp_cmdshell. L'utente specificato deve esistere nel master 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 edizione Standard RVER (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;