xp_cmdshell (Transact-SQL)xp_cmdshell (Transact-SQL)

SE APLICA A: síSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelos APPLIES TO: YesSQL Server NoAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Genera un shell de comandos de Windows y lo pasa a una cadena para ejecutarlo.Spawns a Windows command shell and passes in a string for execution. Los resultados se devuelven como filas de texto.Any output is returned as rows of text.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

  
xp_cmdshell { 'command_string' } [ , no_output ]  

ArgumentosArguments

' command_string '' command_string '
Es la cadena que contiene un comando que se pasa al sistema operativo.Is the string that contains a command to be passed to the operating system. command_string es VARCHAR (8000) o nvarchar (4000) y no tiene ningún valor predeterminado.command_string is varchar(8000) or nvarchar(4000), with no default. command_string no puede contener más de un conjunto de comillas dobles.command_string cannot contain more than one set of double quotation marks. Se requiere un solo par de comillas si hay espacios en las rutas de acceso de archivo o en los nombres de programa a los que se hace referencia en command_string.A single pair of quotation marks is required if any spaces are present in the file paths or program names referenced in command_string. Si tiene problemas con espacios incrustados, considere el uso de nombres de archivo de tipo FAT 8.3 como solución.If you have trouble with embedded spaces, consider using FAT 8.3 file names as a workaround.

no_outputno_output
Es un parámetro opcional que especifica que no se devuelven resultados al cliente.Is an optional parameter, specifying that no output should be returned to the client.

Valores de código de retornoReturn Code Values

0 (correcto) o 1 (error)0 (success) or 1 (failure)

Conjuntos de resultadosResult Sets

La ejecución de la instrucción xp_cmdshell devuelve una lista de directorios del directorio actual.Executing the following xp_cmdshell statement returns a directory listing of the current directory.

EXEC xp_cmdshell 'dir *.exe';  
GO  

Las filas se devuelven en una columna nvarchar (255) .The rows are returned in an nvarchar(255) column. Si se utiliza la opción no_output , solo se devolverá lo siguiente:If the no_output option is used, only the following will be returned:

The command(s) completed successfully.  

ObservacionesRemarks

El proceso de Windows generado por xp_cmdshell tiene los mismos derechos de seguridad que SQL ServerSQL Server la cuenta de servicio.The Windows process spawned by xp_cmdshell has the same security rights as the SQL ServerSQL Server service account.

xp_cmdshell funciona de forma sincrónica.xp_cmdshell operates synchronously. No se devolverá el control al llamador hasta que el comando del shell de comandos esté completo.Control is not returned to the caller until the command-shell command is completed.

xp_cmdshell se pueden habilitar y deshabilitar mediante la administración basada en directivas o ejecutando sp_configure.xp_cmdshell can be enabled and disabled by using the Policy-Based Management or by executing sp_configure. Para obtener más información, vea configuración de área expuesta y Xp_cmdshell opción de configuración del servidor.For more information, see Surface Area Configuration and xp_cmdshell Server Configuration Option.

Importante

Si xp_cmdshell se ejecuta dentro de un lote y devuelve un error, se producirá un error en el lote.If xp_cmdshell is executed within a batch and returns an error, the batch will fail. Es un cambio de comportamiento.This is a change of behavior. En versiones anteriores del MicrosoftMicrosoft SQL ServerSQL Server lote continuaría ejecutándose.In earlier versions of MicrosoftMicrosoftSQL ServerSQL Server the batch would continue to execute.

Cuenta de proxy xp_cmdshellxp_cmdshell Proxy Account

Cuando lo llama un usuario que no es miembro del rol fijo de servidor sysadmin , xp_cmdshell se conecta a Windows mediante el nombre de cuenta y la contraseña almacenados en la credencial denominada # #xp_cmdshell_proxy_account # #.When it is called by a user that is not a member of the sysadmin fixed server role, xp_cmdshell connects to Windows by using the account name and password stored in the credential named ##xp_cmdshell_proxy_account##. Si esta credencial de proxy no existe, se producirá un error en xp_cmdshell .If this proxy credential does not exist, xp_cmdshell will fail.

La credencial de la cuenta de proxy se puede crear ejecutando sp_xp_cmdshell_proxy_account.The proxy account credential can be created by executing sp_xp_cmdshell_proxy_account. Como argumentos, este procedimiento almacenado utiliza un nombre de usuario y una contraseña de Windows.As arguments, this stored procedure takes a Windows user name and password. Por ejemplo, el siguiente comando crea una credencial de proxy para el usuario de dominio de Windows SHIPPING\KobeR que tiene la contraseña de Windows sdfh%dkc93vcMt0.For example, the following command creates a proxy credential for Windows domain user SHIPPING\KobeR that has the Windows password sdfh%dkc93vcMt0.

EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR','sdfh%dkc93vcMt0';  

Para obtener más información, vea sp_xp_cmdshell_proxy_account ()de Transact-SQL .For more information, see sp_xp_cmdshell_proxy_account (Transact-SQL).

PermisosPermissions

Dado que a veces los usuarios malintencionados intentan elevar sus privilegios mediante xp_cmdshell, xp_cmdshell está deshabilitado de forma predeterminada.Because malicious users sometimes attempt to elevate their privileges by using xp_cmdshell, xp_cmdshell is disabled by default. Use sp_configure o la Administración basada en directivas para habilitarla.Use sp_configure or Policy Based Management to enable it. Para más información, vea xp_cmdshell (opción de configuración del servidor).For more information, see xp_cmdshell Server Configuration Option.

Cuando se habilita por primera vez, xp_cmdshell requiere el permiso Control Server para ejecutarse y el proceso de Windows creado por xp_cmdshell tiene SQL ServerSQL Server el mismo contexto de seguridad que la cuenta de servicio.When first enabled, xp_cmdshell requires CONTROL SERVER permission to execute and the Windows process created by xp_cmdshell has the same security context as the SQL ServerSQL Server service account. A SQL ServerSQL Server menudo, la cuenta de servicio tiene más permisos de los necesarios para el trabajo realizado por el proceso creado por xp_cmdshell.The SQL ServerSQL Server service account often has more permissions than are necessary for the work performed by the process created by xp_cmdshell. Para mejorar la seguridad, el acceso a xp_cmdshell debe estar restringido a los usuarios con privilegios elevados.To enhance security, access to xp_cmdshell should be restricted to highly privileged users.

Para permitir que los usuarios que no son xp_cmdshelladministradores puedan usar xp_cmdshell SQL ServerSQL Server y permitir que cree procesos secundarios con el token de seguridad de una cuenta con menos privilegios, siga estos pasos:To allow non-administrators to use xp_cmdshell, and allow SQL ServerSQL Server to create child processes with the security token of a less-privileged account, follow these steps:

  1. Cree y personalice una cuenta de usuario local de Windows o una cuenta de dominio con los permisos mínimos que los procesos requieran.Create and customize a Windows local user account or a domain account with the least privileges that your processes require.

  2. Utilice el procedimiento del sistema sp_xp_cmdshell_proxy_account para configurar xp_cmdshell para que use esa cuenta con privilegios mínimos.Use the sp_xp_cmdshell_proxy_account system procedure to configure xp_cmdshell to use that least-privileged account.

    Nota

    También puede configurar esta cuenta de proxy mediante SQL Server Management StudioSQL Server Management Studio haciendo clic con el botón secundario en propiedades en el nombre del servidor en explorador de objetos y en la pestaña seguridad de la sección cuenta de proxy del servidor .You can also configure this proxy account using SQL Server Management StudioSQL Server Management Studio by right-clicking Properties on your server name in Object Explorer, and looking on the Security tab for the Server proxy account section.

  3. En Management StudioManagement Studio, mediante la base de datos maestra, GRANT exec ON xp_cmdshell TO N'<some_user>'; ejecute la instrucción para proporcionar a los usuarios que no sonadministradores de bases de datos específicos la capacidad de ejecutar xp_cmdshell.In Management StudioManagement Studio, using the master database, execute the GRANT exec ON xp_cmdshell TO N'<some_user>'; statement to give specific non-sysadmin users the ability to execute xp_cmdshell. El usuario especificado debe existir en la base de datos maestra.The specified user must exist in the master database.

Ahora, los usuarios que no son administradores pueden iniciar procesos del sistema operativo con xp_cmdshell y esos procesos se ejecutan con los permisos de la cuenta de proxy que ha configurado.Now non-administrators can launch operating system processes with xp_cmdshell and those processes run with the permissions of the proxy account that you have configured. Los usuarios con el permiso CONTROL SERVER (miembros del rol fijo de servidor sysadmin ) seguirán recibiendo los permisos de SQL ServerSQL Server la cuenta de servicio para los procesos secundarios iniciados por xp_cmdshell.Users with CONTROL SERVER permission (members of the sysadmin fixed server role) will continue to receive the permissions of the SQL ServerSQL Server service account for child processes that are launched by xp_cmdshell.

Para determinar la cuenta de Windows utilizada por xp_cmdshell al iniciar procesos del sistema operativo, ejecute la siguiente instrucción:To determine the Windows account being used by xp_cmdshell when launching operating system processes, execute the following statement:

xp_cmdshell 'whoami.exe'  
  

Para determinar el contexto de seguridad de otro inicio de sesión, ejecute lo siguiente:To determine the security context for another login, execute the following:

EXECUTE AS LOGIN = '<other_login>' ;  
GO  
xp_cmdshell 'whoami.exe' ;  
REVERT ;  
  

EjemplosExamples

A.A. Devolver una lista de archivos ejecutablesReturning a list of executable files

En el siguiente ejemplo se muestra el procedimiento almacenado extendido xp_cmdshell ejecutando un comando de directorio.The following example shows the xp_cmdshell extended stored procedure executing a directory command.

EXEC master..xp_cmdshell 'dir *.exe'  

B.B. No devolver resultadosReturning no output

En el siguiente ejemplo se utiliza xp_cmdshell para ejecutar una cadena de comandos sin devolver los resultados al cliente.The following example uses xp_cmdshell to execute a command string without returning the output to the client.

USE master;  
  
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck  
    \\server2\backups\SQLbcks', NO_OUTPUT;  
GO  

C.C. Utilizar el estado de retornoUsing return status

En el ejemplo siguiente, el xp_cmdshell procedimiento almacenado extendido también sugiere el estado de devolución.In the following example, the xp_cmdshell extended stored procedure also suggests return status. El valor del código de retorno se almacena en la variable @result.The return code value is stored in the variable @result.

DECLARE @result int;  
EXEC @result = xp_cmdshell 'dir *.exe';  
IF (@result = 0)  
   PRINT 'Success'  
ELSE  
   PRINT 'Failure';  

D.D. Escribir el contenido de variables en un archivoWriting variable contents to a file

En el siguiente ejemplo se escribe el contenido de la variable @var en un archivo denominado var_out.txt en el directorio actual del servidor.The following example writes the contents of the @var variable to a file named var_out.txt in the current server directory.

DECLARE @cmd sysname, @var sysname;  
SET @var = 'Hello world';  
SET @cmd = 'echo ' + @var + ' > var_out.txt';  
EXEC master..xp_cmdshell @cmd;  

E.E. Capturar el resultado de un comando en un archivoCapturing the result of a command to a file

En el siguiente ejemplo se escribe el contenido del directorio actual en un archivo denominado dir_out.txt en el directorio actual del servidor.The following example writes the contents of the current directory to a file named dir_out.txt in the current server directory.

DECLARE @cmd sysname, @var sysname;  
SET @var = 'dir/p';  
SET @cmd = @var + ' > dir_out.txt';  
EXEC master..xp_cmdshell @cmd;  

Consulte tambiénSee Also

Procedimientos almacenados extendidos generales (Transact-SQL) General Extended Stored Procedures (Transact-SQL)
xp_cmdshell (opción de configuración del servidor) xp_cmdshell Server Configuration Option
Configuración de Área expuesta Surface Area Configuration
sp_xp_cmdshell_proxy_account ()de Transact-SQLsp_xp_cmdshell_proxy_account (Transact-SQL)