Condividi tramite


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.

Icona di collegamento a un argomentoConvenzioni 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.

ms175046.note(it-it,SQL.90).gifImportante:
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

Guida in linea e informazioni

Assistenza su SQL Server 2005