PsExec y SQL Server

Microsoft tiene un kit de recursos con varias herramientas para la línea de comandos que permiten realizar administrar sistemas remotos y locales. Este grupo de herramientas es conocido como PsTools y entre ella está Psexec, una herramienta para la línea de comandos que permite ejecutar procesos en equipos remotos.

psexec

¿Como ejecutar psexec en un trigger de SQL Server? En realidad esto es válido para cualquier aplicación local.

SET @cadena='C:\ruta_completa\psexec.exe \\ip_remota\  -d "C:\ruta_archivo_bat.bat" var1±'+@var1+'~var2±'+@var2+', NO_OUTPUT'

Con el comando anterior especificamos la ruta del archivo local ejecutable y la el proceso bat que queremos ejecutar en remoto, las variables 1 y 2 son opcionales en caso de que vuestro proceso bat las necesite.

Con el siguiente comando ejecutamos la instrucción almacenada en la variable anterior

exec master..xp_cmdshell @cadena

Recordar que el usuario que ejecuta los procesos de SQL Server debe de tener permisos de red para poder ejecutar los procesos remotos, en caso que tengamos el error Login failed for user (.Net SqlClient Data Provider), lo más probable es que sea un fallo en los permisos.

Otra cosa a tener en cuenta es que a veces falla el proceso la primera vez porque todas estas aplicaciones necesitan que se acepte la licencia antes de ser ejecutadas y SQL Server omite este paso, así que mi recomendación es hacer login en la máquina con el usuario que ejecute los procesos de SQL Server, ejecutar el comando anterior en una ventana MSDOS, aceptar el contrato de licencia (que tiene que se aceptado por cada usuario que lo vaya a utilizar) y de esta forma comprobamos que todo marcha perfecto.

En los logs de SQL Server veremos estos registros bajo el apartado de Windows NT, sistema.

An account was successfully logged on
A logon was attempted using explicit credentials.

En caso de fallo

An account failed to log on.

Y de esta forma podremos ejecutar procesos en máquinas remotas desde un trigger en SQL Server.

Comentarios