Ejecutar una aplicación en otro contexto de seguridad

4778 vistas

Frecuentemente tenemos la necesidad de lanzar una aplicación como si lo hiciera otro usuario (con otros permisos). Generalmente usamos (para versiones posteriores a Windows ME) el menú contextual "Ejecutar como..."

Vamos a ver una función que permite de hacer lo mismo que esta opción pero desde Delphi.



delphi
  1. const
  2.   LOGON_WITH_PROFILE = 1;
  3.   LOGON_NETCREDENTIALS_ONLY = 2;
  4.  
  5. ...
  6.  
  7. procedure ExecWithOtherUser(sUser, sDomain, sPassword: WideString);
  8. var
  9.   wUsername, wDomain, wPassword, wApplicationName: WideString;
  10.   pwUsername, pwDomain, pwPassword, pwApplicationName: PWideChar;
  11.   StartupInfo: TStartupInfo;
  12.   ProcessInfo: TProcessInformation;
  13. begin
  14.   wUsername := sUser ;
  15.   wDomain := sDomain;
  16.   wPassword := Spassword;
  17.   wApplicationName := sExecutable ;
  18.   pwUsername := Addr(wUsername[1]);
  19.   pwDomain := Addr(wDomain[1]);
  20.   pwPassword := Addr(wPassword[1]);
  21.   pwApplicationName := Addr(wApplicationName[1]);
  22.  
  23.   FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  24.   StartupInfo.cb := SizeOf(StartupInfo);
  25.   try
  26.   if not CreateProcessWithLogon(pwUsername, pwDomain, pwPassword, LOGON_NETCREDENTIALS_ONLY,
  27.                                 nil, pwApplicationName, CREATE_DEFAULT_ERROR_MODE,
  28.                                 nil, nil, StartupInfo, ProcessInfo) then
  29.     RaiseLastOSError; // en caso de error, lo mostramos
  30. end;



La función CreateProcessWithLogon está definida en la librería advapi32.dll, por lo que tendremos que declararla:



delphi
  1. function CreateProcessWithLogon; external 'advapi32.dll' name 'CreateProcessWithLogonW';