Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Aplicacion con derechos de administrador (https://www.clubdelphi.com/foros/showthread.php?t=84603)

camiz 10-11-2013 21:43:58

Aplicacion con derechos de administrador
 
hola amigos del club, les comento que quiero que mi aplicacion se ejecute con derechos de administrador he encontrado este codigo en en este hilo, de funcionar funciona. pero con un gran problema que al ejecutarse la aplicacion crea un proseso repetitivo reejecutandose infinidad de veces.

lo he probado en mi aplicacion en
ONSHOW
ONCREATE

el mismo problema, alguien que me ayude como utilizarlo.

Código Delphi [-]
uses
  Windows,  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;

Código Delphi [-]
begin
   RunAsAdmin('Miprograma.exe');
end.

nlsgarcia 11-11-2013 04:34:48

camiz,

Cita:

Empezado por camiz
...este código...al ejecutarse la aplicación crea un proceso repetitivo...ejecutándose infinidad de veces...

Te comento: El código señalado en el Msg #1 no controla el número de instancias de una aplicación, solo permite ejecutar la misma con privilegios de administrador en Windows.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  CurrentSemafor : THandle;

implementation

{$R *.dfm}

// Ejecuta una aplicación con derechos de administrador en Windows
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;

// Verifica si esta activa una instancia de la aplicación por medio de un Semáforo de Control
function CheckInstance(AppName : String) : Boolean;
var
   Semafor : THandle;
begin

   Semafor := CreateSemaphore(nil, 0, 1, PChar(AppName));
   if (Semafor <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
   begin
      CloseHandle(Semafor);
      Result := False;
      Exit;
   end
   else
   begin
      CurrentSemafor := Semafor;
      Result := True;
   end;

end;

// Ejecuta una sola instancia de la aplicación con derechos de administrador por medio de un Semáforo de Control
procedure TForm1.Button1Click(Sender: TObject);
begin
   if CheckInstance('Calc') then
      RunAsAdmin('Calc.exe')
   else
      MessageDlg('La Aplicación ya esta Activa en Memoria',mtInformation,[mbOK],0)
end;

// Libera el Semáforo de Control para Permitir otra Instancia de la Aplicación
procedure TForm1.Button2Click(Sender: TObject);
begin
   CloseHandle(CurrentSemafor);
end;

end.
El código anterior permite ejecutar una única instancia de una aplicación con derechos de administrador en Windows mientras este activo un semáforo de control definido por medio de un string que identifica a la misma.

Revisa estos links:
Cita:

1- Evitar múltiples instancias de nuestra aplicación : http://clubdelphi.com/foros/showthread.php?t=80901

2- Controlling the number of application instances : http://delphi.about.com/od/windowssh.../aa100703a.htm

3- TInstanceControl : http://delphi.about.com/library/weekly/aa110203a.htm

4- CreateSemaphore function : http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Espero sea útil :)

Nelson.

camiz 11-11-2013 21:04:22

Solucionado
 
Gracias nelson por tu aporte, excelente tu aporte.
quisiera compartir otra forma de hacer que nuestra aplicacion se inicie como administrador ya lo he comprobado y funciona al 100%.
está en portugues solo hay que traducir y seguir al pie de la letra Clic aqui.

dardusso23 03-09-2016 13:41:55

Hola! Yo solo lo que necesito seria un boton que al hacerle click ejecute como admin un programa. He usado el codigo de RunAsAdmin que publicaste pero me da un error de que no puede allar el archivo. Copio como lo hice para ver donde esta el error:

[delphi]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls,ShellAPI, sButton;
const
ProgramName = 'MiPrograma.exe';

type
TForm1 = class(TForm)
sButton1: TsButton;
procedure sButton1Click(Sender: TObject);

private

procedure RunAsAdmin( strParameters: String = 'OK'; Handle : HWND = 0);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.RunAsAdmin( strParameters: String;
Handle: HWND);
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';
Info.lpFile := PChar(ProgramName);
Info.lpParameters := PChar(strParameters);
Info.nShow := SW_SHOWNORMAL;

if not ShellExecuteEx(@Info) then
RaiseLastOSError;
end;

procedure TForm1.sButton1Click(Sender: TObject);
begin
RunAsAdmin('MiPrograma.exe');
end;

end.

Muchas gracias

Casimiro Notevi 03-09-2016 15:21:12

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

escafandra 03-09-2016 22:04:57

Código Delphi [-]
ProgramName = 'MiPrograma.exe';

¿Cual es 'MiPrograma.exe'? ¿Existe?


Saludos.

AgustinOrtu 03-09-2016 23:28:31

Pasale como parametro la ruta completa al ejecutable

PD: Por que defines la constante pero despues usas un literal?

dardusso23 05-09-2016 18:50:07

Con la ruta completa funciona. El problema es que me abre la ventana de ejecutar como y ahi hay que seleccionar usuario o administrador y tipear la contraseña. Yo lo que necesito es justamente esquivar esa parte, que el usuario tenga que poner el pass, o sea que el programa ya se eejecute con esos permisos sin pedir autorizacion o contraseña. Se entiende?
Gracias

escafandra 05-09-2016 19:08:24

Eso se puede hacer siempre y cuando sepas ese usuario y contraseña.


Saludos

Casimiro Notevi 05-09-2016 19:12:13

je, je, je...

escafandra 05-09-2016 20:56:50

En el supuesto de que conozcas el usuario y contraseña administrador, puedes usar este código o su traducción a delphi, aquí.


Saludos.

escafandra 06-09-2016 00:11:08

Y si te interesa más información y elevar el procedimiento a cualquier usuario, incluido System y lanzar procedimientos desde System como un usuario con sesión activa: MiniExecuteAs una pequeña aplicación



Saludos.

Casimiro Notevi 06-09-2016 00:16:39

Muy interesante ^\||/


La franja horaria es GMT +2. Ahora son las 20:26:22.

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