Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar aplicacion como administrador en windows 7 (https://www.clubdelphi.com/foros/showthread.php?t=83654)

Caroso 11-07-2013 02:35:17

Ejecutar aplicacion como administrador en windows 7
 
Hola muchachos del foro... nuevamente recurro a ustedes.

Quería saber si alguno de ustedes sabia como hacer, por medio de código, que mi aplicación en Delphi se ejecute como administrador, es decir, que al correr mi aplicación automáticamente tengo privilegios de administrador.

Desde ya muchas gracias.

PD:\ necesito definir esto debido a que debo escribir en la carpeta C:\windows, en un sistema operativo Windows 7...

nlsgarcia 11-07-2013 05:59:39

Caroso,

Cita:

Empezado por Caroso
...como hacer, por medio de código, que mi aplicación en Delphi se ejecute como administrador...

Revisa este código:
Código Delphi [-]
program Project1;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  ShellAPI;

{$R *.res}

procedure RunAsAdmin(const ProgramName: String; const Parameters: String = ''; Handle : HWND = 0);
var
   Info : TShellExecuteInfo;

begin

   FillChar(Info, SizeOf(Info), 0);

   Info.cbSize := SizeOf(Info);
   Info.Wnd := Handle;
   Info.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
   Info.lpVerb := 'runas'; // Eleva los privilegios de ejecución a Administrador
   Info.lpFile := PChar(ProgramName);
   Info.lpParameters := PChar(Parameters);
   Info.nShow := SW_SHOWNORMAL;

   if not ShellExecuteEx(@Info) then
      RaiseLastOSError;

end;

begin
   RunAsAdmin('XProgram.exe');
end.
El código anterior ejecuta el programa XProgram.exe con privilegios de administrador, en este caso particular no se incluyeron parámetros. En lo referente a tu requerimiento XProgram es tu aplicación en Delphi.

Espero sea útil :)

Nelson.

Casimiro Notevi 11-07-2013 10:57:49

Muy buena respuesta.
^\||/

Caroso 11-07-2013 16:21:28

Hola nlsgarcia :)

Muchisimas gracias por tu respuesta, me sirvio muchisimo!!

y como dijo Casimiro Notevi...
Cita:

Empezado por Casimiro Notevi (Mensaje 463666)
Muy buena respuesta.
^\||/

Saludos :)

escafandra 29-11-2013 14:30:10

Aunque ya es un poco viejo el tema, quisiera documentarlo un poco más aportando un enlace de este mismo foro en el que se trató en febrero de 2009. En él muestro como hacer un "runas" no solo como administrador, sino como cualquier usuario e identificando el loging por código.

Ejecutar Como en C++



Saludos.

nlsgarcia 30-11-2013 05:54:17

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.


La franja horaria es GMT +2. Ahora son las 20:28:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi