Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Apagar o reiniciar un equipo remoto con Delphi
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Apagar o reiniciar un equipo remoto con Delphi

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Apagar o reiniciar un equipo remoto con Delphi Responder citando

¿Se puede apagar o reiniciar un equipo desde otro? lo que pretendo es hacer una aplicación Windows con Delphi que pueda apagar un equipo de forma remota. Desde un equipo de la red apagar otro ¿esto es posible? ¿cómo se hace?
MensajePublicado:
Sab Ene 08, 2011 4:40 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Apagar o reiniciar un equipo remoto con Delphi Responder citando



Anuncios



varios escribió:
¿Se puede apagar o reiniciar un equipo desde otro? lo que pretendo es hacer una aplicación Windows con Delphi que pueda apagar un equipo de forma remota. Desde un equipo de la red apagar otro ¿esto es posible? ¿cómo se hace?


Sí es posible, para hacerlo puedes usar la función del API de Windows: InitiateSystemShutdown.
MensajePublicado:
Sab Ene 08, 2011 4:49 pm
Top of PageVer perfil de usuario
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Re: Apagar o reiniciar un equipo remoto con Delphi Responder citando



Anuncios



alonsojpd escribió:
Sí es posible, para hacerlo puedes usar la función del API de Windows: InitiateSystemShutdown.


Ok, no sé mucho de programación ¿me podrías poner un ejemplo de uso de esta función?
MensajePublicado:
Sab Ene 08, 2011 4:50 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Apagar o reiniciar un equipo remoto con Delphi Responder citando



Anuncios



varios escribió:
Ok, no sé mucho de programación ¿me podrías poner un ejemplo de uso de esta función?


Te ponemos a continuación el código fuente complento de la aplicación AjpdSoft Reiniciar Apagar equipo remoto, la descarga gratuita de la aplicación completa con código fuente en Delphi:

http://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=283

El código:

Código:

unit UnidadMenuPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, Buttons, StdCtrls, ExtCtrls,
  ComCtrls, shellapi, inifiles;

type TformMenuPrincipal = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    txtIP: TEdit;
    txtMensaje: TEdit;
    GroupBox2: TGroupBox;
    Label3: TLabel;
    txtSegundos: TEdit;
    Label4: TLabel;
    btEnviar: TBitBtn;
    bDetener: TBitBtn;
    bSalir: TBitBtn;
    LWEB: TLabel;
    opReiniciar: TRadioButton;
    opApagar: TRadioButton;
    opForzar: TCheckBox;
    Memo1: TMemo;
    procedure BtnQuitClick(Sender: TObject);
    procedure txtSegundosKeyPress(Sender: TObject; var Key: Char);
    procedure btEnviarClick(Sender: TObject);
    procedure bDetenerClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure LWEBClick(Sender: TObject);
    procedure opReiniciarClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
end;

var
  formMenuPrincipal: TformMenuPrincipal;

implementation

{$R *.dfm}

const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

var
  hToken: THandle;

//Lee un booleano de un INI
function leBoolINI (clave, cadena : string; defecto : boolean) : boolean;
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    result := readbool (clave, cadena, defecto);
  finally
    free;
  end;
end;

//Lee una cadena de texto de un INI
function leCadINI (clave, cadena : string; defecto : string) : string;
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    result := readString (clave, cadena, defecto);
  finally
    free;
  end;
end;


//escribe un Booleano en un INI
procedure esBoolINI (clave, cadena : string; valor : boolean);
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    writeBool (clave, cadena, valor);
  finally
    free;
  end;
end;

//escribe una cadena de texto en un INI
procedure esCadINI (clave, cadena, valor : string);
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    writeString (clave, cadena, valor);
  finally
    free;
  end;
end;


//Ajustar los privilegios de la máquina
procedure ajustarPrivilegios (equipo : string);
var
  hProc : THandle;
  TP : TTokenPrivileges;
  PrevToken : TTokenPrivileges;
  PSsize : DWORD;
begin
  hProc := GetCurrentProcess;
  OpenProcessToken (hProc, TOKEN_ADJUST_PRIVILEGES +
      TOKEN_QUERY, hToken);
  TP.PrivilegeCount := 1;
  LookupPrivilegeValue (PChar(equipo),
      SE_SHUTDOWN_NAME, TP.Privileges[0].Luid);
  TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges (hToken, False, TP,
      SizeOf(TP), PrevToken, PSsize);
end;

//Enviar comando apagado/reinicio
function enviarComandoApagado (equipo : string; mensaje : string;
    forzar : Boolean; reiniciar : Boolean; tiempoSegundos : Integer) : boolean;
begin
  try
    ajustarPrivilegios (equipo);
  finally
    Result := InitiateSystemShutdown (PChar(equipo), PChar(mensaje),
        tiempoSegundos, forzar, reiniciar);
    CloseHandle( hToken );
  end;
end;

//Detener la orden de apagado/reiniciado
function anularApagado (equipo : string) : boolean;
begin
  try
    ajustarPrivilegios (equipo);
  finally
    result := AbortSystemShutdown (PChar(equipo));
    CloseHandle (hToken);
  end;
end;



procedure TformMenuPrincipal.BtnQuitClick(Sender: TObject);
begin
  close;
end;

procedure TformMenuPrincipal.txtSegundosKeyPress(
    Sender: TObject; var Key: Char);
begin
  if not (Key in [#8, #13, '0'..'9']) then
    Key := #0;
end;

procedure TformMenuPrincipal.btEnviarClick(Sender: TObject);
var
  resultado : boolean;
begin
  resultado := enviarComandoApagado (txtIP.Text, txtMensaje.Text, opForzar.Checked,
      opReiniciar.Checked, StrToInt(txtSegundos.Text));
  if resultado then
    MessageDlg('Comando de apagado/reiniciado enviado correctamente.',
        mtInformation, [mbok], 0)
  else
    MessageDlg('Ha habido algún error al enviar el comando de ' +
        'apagado/reiniciado. Compruebe la IP y asegúrese de que tiene ' +
        'permisos suficientes para ejecutarlo.',
        mtError, [mbok], 0)
end;

procedure TformMenuPrincipal.bDetenerClick(Sender: TObject);
begin
  if anularApagado (txtIP.Text) then
    MessageDlg ('Comando de anulación de apagado/reinicio ' +
        'enviado correctamente.',
        mtInformation, [mbok], 0)
  else
    MessageDlg ('Ha habido algún error al enviar el comando ' +
        'de anulación de apagado/reinicio.',
        mtError, [mbok], 0);
end;

procedure TformMenuPrincipal.bSalirClick(Sender: TObject);
begin
  close;
end;

procedure TformMenuPrincipal.LWEBClick(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'),
      Nil, Nil, SW_SHOWNORMAL);
end;

procedure TformMenuPrincipal.opReiniciarClick(Sender: TObject);
begin
  if opReiniciar.Checked then
    txtMensaje.Text := '¡¡Su equipo se va a reiniciar en ' +
        txtSegundos.Text +
        ' segundos!! Si quiere anular el reinicio utilice el' +
        ' comando "shutdown"' +
        ' con el parámetro "a" en el equipo remoto.'
  else
    txtMensaje.Text := '¡¡Su equipo se va a apagar en ' +
        txtSegundos.Text +
        ' segundos!! Si quiere anular el apagado utilice el' +
        ' comando "shutdown"' +
        ' con el parámetro "a" en el equipo remoto.'
end;

procedure TformMenuPrincipal.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  esCadINI('Configuración', 'IP', txtIP.Text);
  esCadINI('Configuración', 'Mensaje', txtMensaje.Text);
  esCadINI('Configuración', 'Retrasar segundos', txtSegundos.Text);
  esBoolINI('Configuración', 'Forzar', opForzar.Checked);
  esBoolINI('Configuración', 'Reiniciar', opReiniciar.Checked);
  esBoolINI('Configuración', 'Apagar', opApagar.Checked);
end;

procedure TformMenuPrincipal.FormCreate(Sender: TObject);
begin
  txtIP.Text := leCadINI('Configuración', 'IP', '');
  txtSegundos.Text := leCadINI('Configuración',
      'Retrasar segundos', '30');
  opForzar.Checked := leBoolINI('Configuración', 'Forzar', true);
  opReiniciar.Checked := leBoolINI('Configuración',
      'Reiniciar', true);
  opApagar.Checked := leBoolINI('Configuración', 'Apagar', false);
  txtMensaje.Text := leCadINI('Configuración', 'Mensaje', '');
end;

end.
MensajePublicado:
Sab Ene 08, 2011 5:08 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A