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

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse 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), 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. Es necesario un único par de comillas si están presentes en las rutas de acceso del archivo de espacios en blanco o hace referenciados en los nombres de programa 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 un nvarchar (255) columna.The rows are returned in an nvarchar(255) column. Si el no_output se utiliza la opción, se devolverá únicamente los siguientes elementos:If the no_output option is used, only the following will be returned:

The command(s) completed successfully.  

NotasRemarks

El proceso de Windows generados por xp_cmdshell tiene los mismos derechos de seguridad que la SQL ServerSQL Server 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 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, consulte Surface Area Configuration y xp_cmdshell Server Configuration Option.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 de MicrosoftMicrosoft SQL ServerSQL Server el lote continuaría su ejecución.In earlier versions of MicrosoftMicrosoft SQL ServerSQL Server the batch would continue to execute.

Cuenta de proxy xp_cmdshellxp_cmdshell Proxy Account

Cuando se llama a un usuario que no es un miembro de la sysadmin rol fijo de servidor xp_cmdshell se conecta a Windows mediante el nombre de cuenta y la contraseña almacenada 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 no existe esta credencial de proxy, xp_cmdshell se producirá un error.If this proxy credential does not exist, xp_cmdshell will fail.

Puede crear la credencial de cuenta de proxy 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, consulte sp_xp_cmdshell_proxy_account (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 el uso de xp_cmdshell, xp_cmdshell está deshabilitada 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 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 ejecutar y el proceso de Windows creado por xp_cmdshell tiene el mismo contexto de seguridad que la SQL ServerSQL Server 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. El SQL ServerSQL Server cuenta de servicio a menudo tiene más permisos que son 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 deben limitarse 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 usar xp_cmdshelly permiten SQL ServerSQL Server 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 la sp_xp_cmdshell_proxy_account procedimiento del sistema para configurar xp_cmdshell utilizar 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 propiedades en el servidor, nombre en el Explorador de objetos y buscando en el seguridad la pestaña para el Server cuenta de proxy sección.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, con la base de datos maestra, ejecute el GRANT exec ON xp_cmdshell TO '<somelogin>' instrucción para conceder a concretos que no seansysadmin a los usuarios la capacidad de ejecutar xp_cmdshell.In Management StudioManagement Studio, using the master database, execute the GRANT exec ON xp_cmdshell TO '<somelogin>' statement to give specific non-sysadmin users the ability to execute xp_cmdshell. El inicio de sesión especificado debe asignarse a un usuario en la base de datos maestra.The specified login must be mapped to a user in the master database.

    Ahora que no sean administradores pueden iniciar los 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 permiso CONTROL SERVER (los miembros de la sysadmin rol fijo de servidor) seguirán recibiendo los permisos de la SQL ServerSQL Server cuenta de servicio de 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 los procesos del sistema operativo, ejecute la instrucción siguiente: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, la xp_cmdshell procedimiento almacenado extendido también sugiere el estado de retorno.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;  

Vea tambiénSee Also

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