Ir al contenido


Foto

Como hacer que un servicio ejecute un ejecutable con unas credenciales especificas

delphi servicio credenciales

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

#1 Miguel.Tarifa

Miguel.Tarifa

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 23 mayo 2016 - 05:05

Hola a todos!!

 

   Estoy intentando hacer un servicio en Delphi XE8, que a demás de otras cosas, copie un fichero a una unidad de red con unas credenciales especificas.

 

   Para ello, he utilizado la función de Windows "CreateProcessWithLogonW" que se encuentra en la librería advapi32. Tengo dos versiones del programa, uno como escritorio y otro como servicio. El ejecutado como escritorio funciona correctamente pero el servicio me da un código de error 5 (GetLastError 5). También he intentado una tercera variante que es llamar a un ejecutable con los parámetros de usuario, pass, y rutas para que lance el ejecutable que se encarga de la copia con las credenciales, pero me da el mismo error.

 

   Mi duda es si el servicio puede lanzar otro ejecutable con unas credenciales especificas? Si alguien ha hecho algo parecido y ha usado alguna otra función o método le agradezco cualquier información.

 

 Saludos y gracias de antemano!!!!

 

Os dejo el código...


delphi
  1. unit uCopiaFicheroCredenciales;
  2.  
  3. interface
  4.  
  5. uses
  6. System.SysUtils,
  7. Winapi.ShellAPI,
  8. Winapi.Windows;
  9.  
  10. type
  11. TCreateProcWithLogon = function(lpUserName, lpDomain,
  12. lpPassword: pWideChar;
  13. dwLogonFlags: Cardinal;
  14. lpApplicationName,
  15. lpCommandLine: PWideChar;
  16. dwCreationFlags: Cardinal;
  17. lpEnvironment: Pointer;
  18. lpCurrentDirectory: pWideChar;
  19. const lpStartupInfo: TStartupInfo;
  20. var lpProcessInformation:
  21. TProcessInformation): boolean; stdcall;
  22.  
  23. function LanzarCopiaCredenciales(AUsuario: String; APassword : String;
  24. AFicheroOrigen : String; AFicheroDestino : String) : Boolean;
  25.  
  26. implementation
  27.  
  28. function LanzarCopiaCredenciales(AUsuario: String; APassword : String;
  29. AFicheroOrigen : String; AFicheroDestino : String) : Boolean;
  30. var
  31. CreateProcWithLogon: TCreateProcWithLogon;
  32. ProcHandle : NativeUInt;
  33. StartInfo: TStartupInfo;
  34. ProcInfo: TProcessInformation;
  35. begin
  36. Result := False;
  37. try
  38. ProcHandle := LoadLibrary('advapi32');
  39. if ProcHandle <> 0 then
  40. begin
  41. try
  42. //Este proceso nos permite ejecutar una aplicación con unas credenciales especificas
  43. @CreateProcWithLogon := GetProcAddress(ProcHandle, 'CreateProcessWithLogonW');
  44. if @CreateProcWithLogon <> nil then
  45. begin
  46.  
  47. //Simple wrapper for the CreateProcess command
  48. //returns the process id of the started process.
  49. FillChar(StartInfo, SizeOf(TStartupInfo), #0);
  50. FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
  51. StartInfo.cb := SizeOf(TStartupInfo);
  52.  
  53. StartInfo.wShowWindow := SW_SHOWNORMAL;
  54.  
  55. //Documentacion de Microsoft
  56. //https://msdn.microsoft.com/en-us/library/windows/desktop/ms682431(v=vs.85).aspx
  57. CreateProcWithLogon(PChar(AUsuario), ADominio, PChar(APassword), 0,
  58. Pchar('CopiaFicheroCredenciales.exe'),
  59. Pchar('"' + AFicheroOrigen + '" "' + AFicheroDestino + '" '),
  60. 0, nil,
  61. Pchar('C:\Pruebas'),
  62. StartInfo, ProcInfo);
  63. Result := (GetLastError = 0);
  64. if not Result then
  65. raise Exception.Create('Error: ' + IntToStr(GetLastError));
  66. end;
  67. finally
  68. FreeLibrary(ProcHandle);
  69. end;
  70. end;
  71. except
  72. on E: Exception do
  73. raise Exception.Create(E.Message);
  74. end;
  75. end;
  76.  
  77. end.


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 23 mayo 2016 - 08:39

EL problema está en la carga de la librería, revisa esa parte, recuerda que la función LoadLibrary si no se carga correctamente ésta devuelve NULL por lo que deberías hacer la condición de ésta manera:

delphi
  1. if ProcHandle <> NULL then
  2. begin
  3. ...
  4. end;

Saludos.
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.083 mensajes
  • LocationMadrid - España

Escrito 23 mayo 2016 - 11:09

Revisa esto.

 

Saludos.


  • 0





Etiquetado también con una o más de estas palabras: delphi, servicio, credenciales

IP.Board spam blocked by CleanTalk.