viernes, 2 de noviembre de 2007

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.

26 comentarios:

Anónimo dijo...

Hola ,
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

Miledys Taveras dijo...

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.

Anónimo dijo...

Hola gracias por responder , por ahora pude solucionar el problema anterior con esta instruccion :

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

Michael Núñez dijo...

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.

Anónimo dijo...

no esta en un loop
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.

Michael Núñez dijo...

Lo único que se me ocurre es que el xp_cmdshell corre como un services account (por lo que no puede funcionar en el Load de la aplicación) y quizás por eso no funciona.

Anónimo dijo...

Ya encontre el problema. Yo estaba ejecutando el xp_cmdshell en mi servidor y el programa se comunicaba con otro servidor , lo que yo considero el servidor lo toma como una transaccion distribuida y por eso me arrojaba ese error. Asi que puse el exe en el servidor destino y ejecute el xp_xmdshell en ese server y funciono perfecto.
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.

Michael Núñez dijo...

Me alegra que resolvieras el problema, y gracias por compartir con nosotros los conocimientos aprendidos, esperamos poderte servir de ayuda en una próxima ocación.

Anónimo dijo...

buen dia

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

Anónimo dijo...

buen dia

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

Michael Núñez dijo...

Bueno,

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

Anónimo dijo...

tienes algun correo donde te pueda enviar el impr pant?

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

Michael Núñez dijo...

Claro no hay problemas, envialo a elymichael@gmail.com

Anónimo dijo...

no, no me está funcionando
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

Anónimo dijo...

Hola,

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

Michael Núñez dijo...

Buenas Tardes,

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,

MatriXXX dijo...

Hola si ejecuto
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

MatriXXX dijo...

hola al usar:
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

Anónimo dijo...

Me ocurre lo mismo que comentaban arriba, al ejecutar calc.exe se queda "Executing Query", en administrador de tareas he visto que se ejecutaba bajo la cuenta SYSTEM, tal vez tenga algo que ver con la interactuación con el escritorio. Es un Windows 2008 Server con SQL Server 2005.

Un saludo. Adrián.

Michael Núñez dijo...

Hola 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.

Reynert dijo...

Saludos...
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...

Anónimo dijo...

en mi telefono kuando intnto instalar un juego me aparecen "no tiene los permisos necesarios" y no se q hacr!!!

Michael Núñez dijo...

Buenas tardes, lamento informarle que este blog no está dirigido a mantenimiento de equipos, y en todo caso la pregunta es demasiado abierta. Sería bueno que especificara su equipo, modelo, etc para poder ayudarlo.

Anónimo dijo...

bueno mi telefono es un bmobile con teclado berry

cynthia eloisa gonzalez garcia dijo...

hola, alguien que me pueda ayudar, lo que pasa es que necesito transmitir a un servidor sql la nueva informacion de un servidor mysql este servidor esta en un dominio cada que se conecte un nuevo usuario a una aplicacion del dominio necesito tomar esa info y pasarla a sql.





francia liliana batero orozco dijo...

Cordial saludo, Tu me puedes indicar como hago para hacer en ejecutable para coonfiguracion del SQl (levantar Servicios y Modificar el Puerto) Gracias