xp_cmdshell (Transact-SQL)

 

Genera un shell de comandos de Windows y lo pasa a una cadena para ejecutarlo. Los resultados se devuelven como filas de texto.

Se aplica a: SQL Server (SQL Server 2008 a través de la versión actual).

Topic link icon Convenciones de sintaxis de Transact-SQL

  
xp_cmdshell { 'command_string' } [ , no_output ]  

' command_string '
Es la cadena que contiene un comando que se pasa al sistema operativo. command_string es varchar(8000) o nvarchar (4000), no tiene ningún valor predeterminado. command_string no puede contener más de un conjunto de comillas dobles. Un único par de comillas es necesario si los espacios están presentes en las rutas de acceso de archivo o programa al que hace referencia en los nombres command_string. Si tiene problemas con espacios incrustados, considere el uso de nombres de archivo de tipo FAT 8.3 como solución.

no_output
Es un parámetro opcional que especifica que no se devuelven resultados al cliente.

0 (correcto) o 1 (error)

La ejecución de la instrucción xp_cmdshell devuelve una lista de directorios del directorio actual.

EXEC xp_cmdshell 'dir *.exe';  
GO  

Las filas se devuelven en un nvarchar (255) columna. Si el no_output se utiliza la opción, se devolverá solo lo siguiente:

The command(s) completed successfully.  

El proceso de Windows generado por xp_cmdshell tiene los mismos derechos de seguridad como la SQL Server cuenta de servicio.

xp_cmdshell funciona de forma sincrónica. No se devolverá el control al llamador hasta que el comando del shell de comandos esté completo.

xp_cmdshell pueden habilitar y deshabilitar mediante la administración basada en directivas o ejecutando sp_configure. Para obtener más información, vea Surface Area Configuration y xp_cmdshell Server Configuration Option.

System_CAPS_ICON_important.jpg Importante


Si xp_cmdshell se ejecuta dentro de un lote y devuelve un error, se producirá un error en el lote. Es un cambio de comportamiento. En versiones anteriores de MicrosoftSQL Server el lote continuaría su ejecución.

Cuando se llama por 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 ##. Si no existe esta credencial de proxy, xp_cmdshell se producirá un error.

La credencial de cuenta de proxy se puede crear mediante la ejecución de sp_xp_cmdshell_proxy_account. Como argumentos, este procedimiento almacenado utiliza un nombre de usuario y una contraseña de Windows. 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.

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

Para obtener más información, consulte sp_xp_cmdshell_proxy_account ( Transact-SQL ).

Dado que a veces los usuarios malintencionados intentan elevar sus privilegios mediante el uso de xp_cmdshell, xp_cmdshell está deshabilitada de forma predeterminada. Use sp_configure o administración basada en directivas para habilitarla. Para más información, vea xp_cmdshell (opción de configuración del servidor).

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 Server cuenta de servicio. La SQL Server cuenta de servicio a menudo tiene más permisos que son necesarios para el trabajo realizado por el proceso creado por xp_cmdshell. Para mejorar la seguridad, el acceso a xp_cmdshell debería limitarse a los usuarios con privilegios elevados.

Para permitir que no son administradores utilizar xp_cmdshell, y permiten SQL Server Cree procesos secundarios con el token de seguridad de una cuenta con menos privilegios, siga estos pasos:

  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.

  2. Utilice la sp_xp_cmdshell_proxy_account procedimiento del sistema para configurar xp_cmdshell para usar la cuenta con privilegios mínimos.

    System_CAPS_ICON_note.jpg Nota


    También puede configurar esta cuenta de proxy mediante SQL Server Management Studio haciendo clic en propiedades en el servidor de nombre en el Explorador de objetos y buscando en el seguridad pestaña para el cuenta de proxy de servidor sección.

  3. En Management 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. El inicio de sesión especificado debe asignarse a un usuario en la base de datos maestra.

Ahora no son administradores pueden iniciar los procesos del sistema operativo con xp_cmdshell y los procesos que se ejecutan con los permisos de la cuenta de proxy que haya configurado. Los usuarios con permiso CONTROL SERVER (miembros de la sysadmin rol fijo de servidor) seguirán recibiendo los permisos de la SQL Server cuenta de servicio para los procesos secundarios iniciados por xp_cmdshell.

Para determinar la cuenta de Windows usada por xp_cmdshell al iniciar procesos del sistema operativo, ejecute la instrucción siguiente:

xp_cmdshell 'whoami.exe'  
  

Para determinar el contexto de seguridad de otro inicio de sesión, ejecute lo siguiente:

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

A. Devolver una lista de archivos ejecutables

En el siguiente ejemplo se muestra el procedimiento almacenado extendido xp_cmdshell ejecutando un comando de directorio.

EXEC master..xp_cmdshell 'dir *.exe''  

B. No devolver resultados

En el siguiente ejemplo se utiliza xp_cmdshell para ejecutar una cadena de comandos sin devolver los resultados al cliente.

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

C. Utilizar el estado de retorno

En el ejemplo siguiente, la xp_cmdshell procedimiento almacenado extendido también sugiere el estado de retorno. El valor del código de retorno se almacena en la variable @result.

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

D. Escribir el contenido de variables en un archivo

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.

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

E. Capturar el resultado de un comando en un archivo

En el siguiente ejemplo se escribe el contenido del directorio actual en un archivo denominado dir_out.txt en el directorio actual del servidor.

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

Extendidos generales procedimientos almacenados ( Transact-SQL )
xp_cmdshell (opción) de configuración de servidor
Configuración de área expuesta
sp_xp_cmdshell_proxy_account ( Transact-SQL )

Adiciones de comunidad

AGREGAR
Mostrar: