Ver Mensaje Individual
  #6  
Antiguo 30-11-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Club Delphi,

Cita:
Empezado por escafandra
...como hacer un "RunAs" no solo como administrador, sino como cualquier usuario...
Esta es la implementación en Delphi del código sugerido en el Msg #5:
Código Delphi [-]
function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: PWideChar;
                                 dwLogonFlags: Cardinal;
                                 lpApplicationName, lpCommandLine: PWideChar;
                                 dwCreationFlags: Cardinal;
                                 lpEnvironment: Pointer;
                                 lpCurrentDirectory: PWideChar;
                                 var lpStartupInfo: TStartupInfo;
                                 var lpProcessInfo: TProcessInformation
                                 ): LongBool; stdcall; external 'advapi32.dll';

function RunAs(const UserName, Domain, Password, PrgName, CmdLine : PWideChar; Wait : Boolean) : Boolean;

var
   StrInf : TStartupInfo;
   PrcInf : TProcessInformation;

begin

   FillChar(StrInf,SizeOf(TStartupInfo),0);
   FillChar(PrcInf,SizeOf(TProcessInformation),0);
   StrInf.cb := SizeOf(TStartupInfo);
   StrInf.wShowWindow := SW_SHOWNORMAL;

   Result := CreateProcessWithLogonW(UserName,
                                     Domain,
                                     Password,
                                     1, 
                                     PrgName,
                                     CmdLine,
                                     0,
                                     nil,
                                     nil,
                                     StrInf,
                                     PrcInf);

   if Result then
   begin
      if Wait then WaitForSingleObject(PrcInf.hProcess, INFINITE);
      CloseHandle(PrcInf.hProcess);
      CloseHandle(PrcInf.hThread);
   end
   else
      MessageDlg(SysErrorMessage(GetLastError),mtError,[mbOK],0);

end;
El código anterior permite ejecutar un proceso con el usuario, password y dominio requerido con un switch de control de espera de terminación de proceso.

Un ejemplo de su uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   RunAs('UserName','Dominio','Password','cmd.exe','/k dir c:\', True);
end;
El código anterior inicia el shell de Windows y ejecuta el comando dir con la opción /k (Ejecutar un cmd y mantener abierto el shell) esperando que el proceso finalize (Cerrar el Shell) por medio del switch en True.

Revisen estos links:
Cita:
CreateProcessWithLogonW function : http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Aplicacion con derechos de administrador : http://www.clubdelphi.com/foros/showthread.php?t=84603
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 30-11-2013 a las 06:10:08.
Responder Con Cita