Ir al contenido


Foto

Aplicacion ejecutada por usuario System y HomePath del mismo

ssh rsync homepath system

  • Por favor identifícate para responder
6 respuestas en este tema

#1 seba_13680

seba_13680

    Member

  • Miembros
  • PipPip
  • 27 mensajes

Escrito 27 marzo 2017 - 08:32

Buen dia a todos y saludos¡

 

Continuando con el desarrollo y basandome en el servicio desarrollado por Escafranda

 

 

 http://delphiaccess....de-un-servicio/

 

Surguieron algunas dudas, consultas y varios aprendizajes ...

 

Como el servicio se ejecuta con el usuario System, las demas aplicaciones tambien son ejecutadas como System

en este caso el servicio llama a un Launcher.exe que el cual se programan las copias de seguridad, el cual llama a Copias.exe de acuerdo al  dia y hora programado.

El tema es que Copias.exe usa el siguiente comando y parametro

 

ComandoUno:=('c:\copias\bin\rsync --log-file=/cygdrive/c/copias/log/usuario_data.log --progress -avzPe /cygdrive/c/copias/bin/ssh.exe -l  usuario -i | /cygdrive/c/Documents\ and\ Settings/usuario/.ssh/known_hosts o + path + |

/cygdrive/c/origen/data/  xxx.xxx.xxx.xxx:/home/usuario/destino/data );

 

y como no es usuario logeado, busca el archivo (known_hosts) en otro directorio como indica la imagen (ssh.jpeg)

 

A path " /cygdrive/c/Documents\ and\ Settings/usuario/.ssh/known_hosts" lo leo y armo con 

path:=('c:'+GetEnvironmentVariable('HOMEPATH')+'\.ssh\known_hosts') que cuando es ejecutado por el usuario logueado muestra

el path completo, y ejecuta el programa como corresponde, no asi con el usuario System que no muestra nada, tampoco el archivo

known_hosts

 

Y bueno como siempre cualquier sugerencia, orientacion y comentario es siempre bienvenido

muchas gracias desde ya ...

saludos¡ 

 

Archivos adjuntos

  • Archivo adjunto  ssh.jpg   45,99KB   1 descargas

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 27 marzo 2017 - 11:16

Si lo que te interesa es que Copias.exe se ejecute por el usuario activo (sesión activa) entonces debes usar la técnica que muestras en el enlace, en concreto la función RunAsCurrentUser para que ejecute el Launcher o Copias.exe. Al realizar esto, la app no es System sino que su dueño es el usuario activo con lo que la variable de entorno HOMEPATH debería devolver lo que buscas.

 

 

Saludos.


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 marzo 2017 - 02:08

Yo la verdad es que no te sabría asesorar mucho, el maestro de las APIs Escafandra es indicado para encaminarte.

Lo que si me permito señalar, es la extraña cantidad de ejecutables que has descripto en otra de tus intervensiones. ¿Para que tanto? Me parece, a mi, que podría hacerse las cosas con menos ejecutables, más de 2 me parece excesivo.

 

Saludos,


  • 1

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 27 marzo 2017 - 02:19

Lo que si me permito señalar, es la extraña cantidad de ejecutables que has descripto en otra de tus intervensiones. ¿Para que tanto? Me parece, a mi, que podría hacerse las cosas con menos ejecutables, más de 2 me parece excesivo.

 

Coincido con Delphius, dos ejecutables son suficientes y no hace falta un servicio, a no ser que alguno sea de un tercero y pretendas controlarlo desde tu aplicación, en ese caso ya son tres...

 

 

Saludos.


  • 0

#5 seba_13680

seba_13680

    Member

  • Miembros
  • PipPip
  • 27 mensajes

Escrito 28 marzo 2017 - 02:44

Buenas noches Escafandra¡
Buenas noches Delphius¡ 
y gracias por sus comentarios, siempre bienvenidos¡ 

 

Si lo que te interesa es que Copias.exe se ejecute por el usuario activo (sesión activa) entonces debes usar la técnica que muestras en el enlace, en concreto la función RunAsCurrentUser para que ejecute el Launcher o Copias.exe. Al realizar esto, la app no es System sino que su dueño es el usuario activo con lo que la variable de entorno HOMEPATH debería devolver lo que buscas.

 

 

Saludos.

 

Utilize la funcion RunAsCurrentUser desde el servicio.exe y el mismo codigo desde una aplicacion, y hace algo muy curioso
Efectivamente ejecuta la aplicacion como el usuario logueado o activo, pero no asigna variable de entorno HOMEPATH, por lo tanto ssh no reconoce los known_hosts y menos las llaves generadas (Prueba en Win xp sp3) o sea que el tema va por otro lado mas allà del usuario que ejecuta la aplicacion
 
Hice pruebas con las siguientes funciones, y ejecutando "a mano" muestra las variables, pero ejecutadas desde el servicio como system no lo hace, sin dudas que son distintas.
GetEnvVar('HOMEPATH');
GetEnvironmentVariable('HOMEPATH');
 

Yo la verdad es que no te sabría asesorar mucho, el maestro de las APIs Escafandra es indicado para encaminarte.

Lo que si me permito señalar, es la extraña cantidad de ejecutables que has descripto en otra de tus intervensiones. ¿Para que tanto? Me parece, a mi, que podría hacerse las cosas con menos ejecutables, más de 2 me parece excesivo.

 

Saludos,

 

La idea es un sistema de copias de seguridad, por eso tanto control, el servicio que controla la ejecucion del launcher.exe (en donde esta la posibilidad de configurar fecha, la hora, u otras notificaciones) y que ejecute copias.exe que solo hace las copias a traves de rsync y ssh
por el momento es lo que necesito, por supuesto que en proximas version irè "afinando" el codigo y con el tema de las variables de entorno que aun no puedo solucionar intentarè utilizar algun componente con las funciones de ssh o rsync, la idea fue siempre reemplazar al "programador de tareas" de windows que no es muy efectivo en ciertas tareas y tener mas control en la ejecucion y la compatibilidad
 
y bueno desde ya en lo comentado, cualquier consejo o comentario es bienvenido ...
 
continuo investigando, saludos y exitos¡ (y)

  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 marzo 2017 - 11:16

...
Utilize la funcion RunAsCurrentUser desde el servicio.exe y el mismo codigo desde una aplicacion, y hace algo muy curioso
Efectivamente ejecuta la aplicacion como el usuario logueado o activo, pero no asigna variable de entorno HOMEPATH
...


Como indicaba en el truco Lanzar una aplicación GUI desde un servicio
 

Añadir que en caso de necesidad se puede añadir un bloque con todas las variables de entorno del usuario con la API CreateEnvironmentBlock.


Esto es para que el proceso creado tenga las variables de entorno del usuario en cuestión. Para introducir esto en la función se debe modificar la función RunAsCurrentUser de la siguiente forma:


delphi
  1. function CreateEnvironmentBlock(var lpEnvironment: Pointer; hToken: THandle; bInherit: BOOL): BOOL; stdcall external 'Userenv.dll';
  2. function DestroyEnvironmentBlock(lpEnvironment: Pointer): BOOL; stdcall external 'Userenv.dll';
  3. ...............
  4.  
  5. function RunAsCurrentUser(Cmd: PCHAR): boolean;
  6. var
  7. hToken: THandle;
  8. pInfo: PROCESS_INFORMATION;
  9. sInfo: STARTUPINFO;
  10. sa: SECURITY_ATTRIBUTES;
  11. lpEnvironment: pointer;
  12. begin
  13. Result:= false;
  14. hToken:= GetCurrentUserToken();
  15. if hToken <> 0 then
  16. begin
  17. lpEnvironment:= nil;
  18. CreateEnvironmentBlock(lpEnvironment, hToken, true);
  19.  
  20. ZeroMemory(@sInfo, sizeof(STARTUPINFO));
  21. sInfo.cb:= sizeof(STARTUPINFO);
  22. sInfo.wShowWindow:= SW_SHOW;
  23.  
  24. ZeroMemory(@sa, sizeof(STARTUPINFO));
  25. sa.nLength:= sizeof(sa);
  26. Result:= CreateProcessAsUser(hToken, Cmd, nil, nil, nil, FALSE, NORMAL_PRIORITY_CLASS or CREATE_UNICODE_ENVIRONMENT, lpEnvironment, nil, sInfo, pInfo);
  27. DestroyEnvironmentBlock(lpEnvironment);
  28. CloseHandle(hToken);
  29. if Result then
  30. begin
  31. CloseHandle(pInfo.hProcess);
  32. CloseHandle(pInfo.hThread);
  33. end;
  34. end;
  35. end;

Ahora lo que sigue debe dar la ruta del usuario:
 


delphi
  1. GetEnvironmentVariable('SystemDrive') + GetEnvironmentVariable('HOMEPATH');

 
Probado en Win10 en una app lanzada desde SYSTEM con el servicio MiniSystem y compilada con Delphi 7 (ojo con esto último por el unicode)

 

 

Saludos.


  • 1

#7 seba_13680

seba_13680

    Member

  • Miembros
  • PipPip
  • 27 mensajes

Escrito 28 marzo 2017 - 02:45

Increiblee Escafandra¡  :ap:

Realmente lo suyo es para alquilar balcones y ver al maestro de las APIs hacer su magia¡ MiniSystem  4k (3.548 Bytes)  :| 

muchisimas gracias por todo, funciono sin inconvenientes en Windows XP sp3, con Delphi 7, en breves lo instalo en distintas version de Windows.

Un fuerte abrazo y todos los exitos por allà¡ 

ahora a continuar estudiando y aprendiendo de este maravilloso Entorno de desarrollo :) 


  • 0




IP.Board spam blocked by CleanTalk.