Como ejecutar una aplicación desde SQL.
Hola Jóvenes. Me estoy estrenando en el blog con esta publicación, así que espero brindarles en lo adelante muchas informaciones que les sirvan de soporte.
Entrando en materia, en ocasiones necesitamos que al ejecutar cierto Store Procedure, DTS, etc.; requerimos la utilización de alguna aplicación para que efectúe una operación secundaria. La aplicación, podemos ejecutarla (dispararla) mediante el Store Procedure "xp_cmdshell", utilizando la siguiente instrucción dentro del Query que estemos ejecutando:
Exec xp_cmdshell 'C:\WINDOWS\system32\calc.exe'
Este Store Procedure usualmente no está habilitado por lo que, es necesario solicitar autorización al DBA de los usuarios que van a utilizarlo. Además, en otros casos, es posible que no este habilitado el SP en la base de datos (Master), en dado caso, es necesario su configuración (para lo cual necesitamos privilegios de administrador) vía el SP "sp_configure" de la siguiente forma:
--Permitir que las opciones avanzadas puedan ser cambiadas.
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
--Permitir el uso de SP XP_CMDSHELL.
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Hasta pronto.
Entrando en materia, en ocasiones necesitamos que al ejecutar cierto Store Procedure, DTS, etc.; requerimos la utilización de alguna aplicación para que efectúe una operación secundaria. La aplicación, podemos ejecutarla (dispararla) mediante el Store Procedure "xp_cmdshell", utilizando la siguiente instrucción dentro del Query que estemos ejecutando:
Exec xp_cmdshell 'C:\WINDOWS\system32\calc.exe'
Este Store Procedure usualmente no está habilitado por lo que, es necesario solicitar autorización al DBA de los usuarios que van a utilizarlo. Además, en otros casos, es posible que no este habilitado el SP en la base de datos (Master), en dado caso, es necesario su configuración (para lo cual necesitamos privilegios de administrador) vía el SP "sp_configure" de la siguiente forma:
--Permitir que las opciones avanzadas puedan ser cambiadas.
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
--Permitir el uso de SP XP_CMDSHELL.
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Hasta pronto.
Comentarios
tu blog es muy interesante . Felicidades.
Tengo una duda espero puedas ayudarme :
Ejecuto Exec xp_cmdshell 'C:\WINDOWS\system32\calc.exe'
pero si quiero ejecutar cualquier otro programa hecho por mi me marca el siguiente error :
" no se reconoce como un comando interno o externo"
saludos
Me parece que el quizás el usuario con que estás tratando ejecutar tu propia aplicación, no tiene los permisos necesarios para hacerlo.
Espero te sirva de ayuda.
Exec master..xp_cmdshell ' cmd /c "C:\Documents and Settings\Usuario\Mis documentos\Visual Studio Projects\myexe.exe"'
o solamente :
Exec master..xp_cmdshell '"C:\Documents and Settings\Usuario\Mis documentos\Visual Studio Projects\myexe.exe"'
por alguna razon necesitaba las comillas dobles .
Bueno el problema con el que ahora me topo ( espero puedas ayudarme) es que cuando llega a la parte de iniciar la transaccion :
objcon.Open()
trans = objcon.BeginTransaction
Me sale el error de System.NullReferenceException
si pongo entre comentarios el inicio de la transaccion (trans= ..) el xp_cmdshell funciona bien , pero cuando intento la trans me marca el error , es muyimportante esto ya que pues necesito seguridad a la hora de pasar los datos y esto me lo da la transaccion .
Estoy algo desesperado :( espero puedas ayudarme .
como dato adicional mi cadenas de conexion esta en app.config pero pues te digo que la parte de codigo de abrir la conexion lo hace bien.
saludos
Una pregunta, no veo nada estraño con la transacción, por lo que tengo dos preguntas?
La sección:
objcon.Open()
trans = objcon.BeginTransaction
se encuentra dentro de algún loop?
El sistema funciona correctamente si lo ejecutas normalmente?
Si está dentro del loop es posible que la transacción en un momento dado se pierda.
Espero te ayude.
simplemente en un try catch
y efectivamente cuando ejecuto normalmente en el visual studio corre bien . de hecho lo tengo puesto en el sub main de la aplicacion ya que he leido que el xp_cmdshell no puede ejecutar en load de pantallas.
Me imagino que para hacer lo primero debo configurar ambas servidores para que acepten la transaccion distribuida y asi funcionaria bien.
Muchas gracias por su tiempo. Si tengo otras duda ya te estare molestando de nuevo . Gracias.
ojala y me peuan ayudar necesito ejecutar una aplicacion de vb.net desde sql con un trigger y ya probe
exec master..xp_cmdshell 'dir *.exe'
pero al momento de ejecutar la aplicacion me marcar un error
"la apliacion genero una excepcion que no se pudo controlar"
si me pueden ayudar de antemano gracias
ojala y me peuan ayudar necesito ejecutar una aplicacion de vb.net desde sql con un trigger y ya probe
exec master..xp_cmdshell 'dir *.exe'
pero al momento de ejecutar la aplicacion me marcar un error
"la apliacion genero una excepcion que no se pudo controlar"
si me pueden ayudar de antemano gracias
para poderte responder lo primero que hay que ver donde es que te está dando el error exactamente, porque ese error no dice mucho, recuerda que si la aplicación es vb.net debes ejecutarla en el sub main no en el load. Pero mira a ver que hace la aplicación en la línea donde lanza el error, mira a ver si puedes capturarlo e imprimirlo en un archivo.
Saludos
es una aplicacion de consola esta en el sub main y si ejecuto la aplicacion directamente todo funciona bien pero si intento ejecutarla desde sql con la sentencia
exec master..xp_cmdshell 'dir *.exe'
me mearca el error
de antemano gracias
con el siguiente ejmplo
Exec xp_cmdshell 'C:\WINDOWS\system32\calc.exe'
sql server se queda asi:
ejecutando batch.....
y alli se queda horas
cualquier ejecutable no lo corre
Referente al tema que comentais, yo también tengo una duda y no sé muy bien como hacerlo. Necesito que cuando mi base de datos sql server 2000 se modifique un campo con un determinado valor se ejecute un trigger y me imprima un informe con los datos modificados. Como puedo hacer esto?
Espero vuestra respuesta. Ya que este tema me es muy urgente.
Muchas gracias
Me imagino que haríamos lo mismo que con una aplicación cualquiera, ejecutas el trigger cuando se actualice el campo que deseas y mandas a correr una aplicación ejecutable con el procedimientos XP_CMDSHELL que te imprime el reporte deseado, ya esto tendrás que programarlo para que te funcione.
También existe el reporting services de SQL Server, pero no tengo mucha experiencia con este tipo de reporte para decirte si puede o no funcionar.
Saludos,
Exec xp_cmdshell 'dir *.exe'
funciona me enlista los archivos.
Si utilizo :
Exec xp_cmdshell 'C:\WINDOWS\system32\calc.exe'
se queda ejecutando la consulta y no pasa nada
ya use :
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
al usar esta instruccion :
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
me marca que no existe esa opcion
por que no me ejecutara los exe, alguna sugerencia
xp_cmdshell 'dir *.exe'
Funciona me enlista los archivos.
Si utilizo
Exec xp_cmdshell 'C:\WINDOWS\system32\calc.exe'
se queda ejecutando
ya use este para habilitar la configuracion
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
pero al usar este :
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
me dice que la opcion no existe
alguna sugerencia del por que el cal.exe no lo ejecuta
Un saludo. Adrián.
Un Gusto que nos visites, eso que te ocurre puede ocurrir por dos razones, porque el usuario con el que estás ejecutando no tiene permisos y posiblemente no sea mediante windows authentication. Ese es el motivo por el que el servicio toma el local system para ejecutar tu servicio.
disculpen si soy directo la prisa me agobia
me sucede lo de los comentarios anteriores...
cualquier ejecutable que coloco incluyendo calc.exe
se queda eternamente ejecutando la consulta pero nunca aparece la calculadora...
revisando el administrador de tareas me di cuenta de que sql si ejecuta el archivo, pero lo hace como servicio de red en lugar de ejecutarlo como el usuario actual de windows...
me explico....(mejor)
exec xp_cmdshell 'c:\WINDOWS\system32\notepad.exe';
go
en el administrador de tareas de windows en la pestaña procesos muestra lo siguiente
nombre de la imagen = notepad.exe // nombre de proceso = servicio de red
hay alguna manera de especificar que usuario del equipo local quiero que se use para abrir el archivo o alguna otra manera de solucionar esto... si ya hubo gente a quien le funciono podria ser cuestion de la configuracion de sql
mi version de sql es:
SQL 2005 express
gracias de antemano por la ayuda...
ejecuto esta secuencia para poder comprimir un archvio . bak
SET @Orden ='c:\"Program Files (x86)"\Winrar\Winrar.exe a -m5 -df ' + @NombreRAR + ' ' + @NombreCompleto
EXEC master.dbo.xp_cmdshell @Orden
pero al realizar el exec me sale el sigueinte error :
Mens. 0, Nivel 11, Estado 0, Línea 0
Error grave en el comando actual. Los resultados, si los hay, se deben descartar.
y no continua