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...
unit uCopiaFicheroCredenciales; interface uses System.SysUtils, Winapi.ShellAPI, Winapi.Windows; type TCreateProcWithLogon = function(lpUserName, lpDomain, lpPassword: pWideChar; dwLogonFlags: Cardinal; lpApplicationName, lpCommandLine: PWideChar; dwCreationFlags: Cardinal; lpEnvironment: Pointer; lpCurrentDirectory: pWideChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): boolean; stdcall; function LanzarCopiaCredenciales(AUsuario: String; APassword : String; AFicheroOrigen : String; AFicheroDestino : String) : Boolean; implementation function LanzarCopiaCredenciales(AUsuario: String; APassword : String; AFicheroOrigen : String; AFicheroDestino : String) : Boolean; var CreateProcWithLogon: TCreateProcWithLogon; ProcHandle : NativeUInt; StartInfo: TStartupInfo; ProcInfo: TProcessInformation; begin Result := False; try ProcHandle := LoadLibrary('advapi32'); if ProcHandle <> 0 then begin try //Este proceso nos permite ejecutar una aplicación con unas credenciales especificas @CreateProcWithLogon := GetProcAddress(ProcHandle, 'CreateProcessWithLogonW'); if @CreateProcWithLogon <> nil then begin //Simple wrapper for the CreateProcess command //returns the process id of the started process. FillChar(StartInfo, SizeOf(TStartupInfo), #0); FillChar(ProcInfo, SizeOf(TProcessInformation), #0); StartInfo.cb := SizeOf(TStartupInfo); StartInfo.wShowWindow := SW_SHOWNORMAL; //Documentacion de Microsoft //https://msdn.microsoft.com/en-us/library/windows/desktop/ms682431(v=vs.85).aspx CreateProcWithLogon(PChar(AUsuario), ADominio, PChar(APassword), 0, Pchar('CopiaFicheroCredenciales.exe'), Pchar('"' + AFicheroOrigen + '" "' + AFicheroDestino + '" '), 0, nil, Pchar('C:\Pruebas'), StartInfo, ProcInfo); Result := (GetLastError = 0); if not Result then raise Exception.Create('Error: ' + IntToStr(GetLastError)); end; finally FreeLibrary(ProcHandle); end; end; except on E: Exception do raise Exception.Create(E.Message); end; end; end.