xp_cmdshell (Transact-SQL)
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 della sintassi Transact-SQL
Sintassi
xp_cmdshell { 'command_string' } [ , no_output ]
Argomenti
- 'command_string'
Stringa che contiene un comando da passare al sistema operativo. command_string è di tipo varchar(8000) o nvarchar(4000) e non prevede alcun valore predefinito. command_string può contenere una sola coppia di virgolette doppie. È obbligatorio utilizzare una sola coppia di virgolette doppie se i percorsi di file o i nomi di programma a cui viene fatto riferimento in command_string contengono spazi. 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 indica che non è richiesta la restituzione di output al client.
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 di tipo nvarchar(255). Se si specifica l'opzione no_output verrà restituito unicamente il messaggio seguente:
The command(s) completed successfully.
Osservazioni
Il processo di Windows generato da xp_cmdshell dispone degli stessi diritti di protezione dell'account del servizio SQL Server.
La stored procedure xp_cmdshell funziona in modo sincrono, ovvero il controllo viene restituito al chiamante solo dopo il completamento del comando della shell.
È possibile attivare e disattivare xp_cmdshell tramite lo strumento Configurazione superficie di attacco e l'esecuzione di sp_configure. Per ulteriori informazioni, vedere Configurazione superficie di attacco e Opzione xp_cmdshell.
Importante: |
---|
Se si esegue xp_cmdshell all'interno di un batch e viene restituito un errore, l'intero batch avrà esito negativo. Questa è una differenza funzionale rispetto alle versioni precedenti di Microsoft SQL Server in cui l'esecuzione del batch continuerebbe. |
Account proxy per xp_cmdshell
Se viene chiamata da un utente non membro del ruolo predefinito del server sysadmin, la stored procedure xp_cmdshell si connette a Windows utilizzando il nome di account e la password archiviati nella credenziale denominata ##xp_cmdshell_proxy_account##. Se questa credenziale proxy non esiste, l'esecuzione di xp_cmdshell avrà esito negativo.
È possibile creare la credenziale per l'account proxy 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 ulteriori informazioni, vedere sp_xp_cmdshell_proxy_account (Transact-SQL).
Autorizzazioni
È richiesta l'autorizzazione CONTROL SERVER.
Valori restituiti
0 (esito positivo) o 1 (esito negativo)
Esempi
A. Restituzione di un elenco di file eseguibili
Nell'esempio seguente la stored procedure estesa xp_cmdshell
viene utilizzata per eseguire un comando dir.
EXEC master..xp_cmdshell 'dir *.exe'
B. Utilizzo dei comandi net di Windows
Nell'esempio seguente viene illustrato l'utilizzo di xp_cmdshell
in una stored procedure. In questo esempio viene utilizzato il comando net send
per avvisare gli utenti della chiusura imminente di un'istanza SQL Server, il server viene quindi sospeso con il comando net pause
e infine il server viene chiuso con il comando net stop
.
CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server
shutting down in 10 minutes. No more connections
allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server
shutting down in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server
shutting down in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output
C. Esecuzione di un comando senza restituzione dell'output
Nell'esempio seguente la stored procedure xp_cmdshell
viene utilizzata 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
D. Restituzione del codice di stato
Nell'esempio seguente la stored procedure estesa xp_cmdshell
viene impostata per la restituzione di un codice di stato. Il codice restituito viene archiviato nella variabile @result
.
DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure'
E. Scrittura del contenuto di una variabile 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
F. Memorizzazione del 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
Vedere anche
Riferimento
Stored procedure estese generali (Transact-SQL)
sp_xp_cmdshell_proxy_account (Transact-SQL)
Altre risorse
Opzione xp_cmdshell
Configurazione superficie di attacco