Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Comando InitiateSystemShutDown? (https://www.clubdelphi.com/foros/showthread.php?t=9867)

mrmanuel 04-05-2004 18:00:47

Comando InitiateSystemShutDown?
 
Hola todos

¿alguien me podría explicar como puedo utilizar el comando InitiateSystemShutDown?

Lo que pretendo hacer es apagar, desde mi ordenador, un Pc perteneciente a mi misma red.

La ayuda de delphi dice:


Código:

  InitiateSystemShutdown(
      LPTSTR lpMachineName,        // address of name of computer to shut down
      LPTSTR lpMessage,        // address of message to display in dialog box
      DWORD dwTimeout,        // time to display dialog box
      BOOL bForceAppsClosed,        // force applications with unsaved changes flag
      BOOL bRebootAfterShutdown        // reboot flag
      );


he probado a poner en el campo: "LPTSTR lpMachineName", el nombre del equipo y la Ip. Y no consigo que funcione.

delphi.com.ar 04-05-2004 18:14:55

Prestaste atencion a este breve comentario:
Cita:

To shut down the local computer, the calling process must have the SE_SHUTDOWN_NAME privilege. To shut down a remote computer, the calling process must have the SE_REMOTE_SHUTDOWN_NAME privilege on the remote computer. By default, users can enable the SE_SHUTDOWN_NAME privilege on the computer they are logged onto, and administrators can enable the SE_REMOTE_SHUTDOWN_NAME privilege on remote computers.
Common failures include an invalid or inaccessible computer name or insufficient privilege.

mrmanuel 05-05-2004 08:41:11

Si ya lo dijo mi abuela:

"dejate de tonterias de ordenadores y parches y ponte a estudiar ingles, que te será mucho mas fructifero".

¿Como puedo controlar los provilegios en el pc que quiero apagar?


Saludos y gracias.

mrmanuel 11-05-2004 12:34:39

Hola nuevamente.

He estado mirando la ayuda de Delphi, y en la version 7 no dice nada, en la 5 dice lo que ha indicado el compañero --> delphi.com.ar.


La verdad, he estado haciendo distintas pruebas y no consigo nada.

las pruebas las he realizado en WinMe, aunque tendría que funcionar en 98, 2000 y Xp.

Gracias

delphi.com.ar 11-05-2004 15:47:08

En un Win9x supongo

delphi.com.ar 11-05-2004 15:48:07

Cita:

Empezado por delphi.com.ar
En un Win9x supongo

que debe tener que estar configurado para "administración remota". (Panel de Control \ Contraseñas \ Administración Remota)

Saludos!

aram2r 11-05-2004 16:54:35

Yo consigo apagar los ordenadores de mi red...pero claro, tengo permisos de administrador....pero mi problema es, tanto apagando los equipos de la red como el mio propio con ExitWindowsEx() q cuando se apagan se kedan con el viejo mesaje de AHORA PUEDE USTED APAGAR SU EQUIPO CON SEGURIDAD ...
Como puedo evitar esto????? yo lo q kiero es q simplemente se apagen y ya esta...... Estoy trabajando bajo win2000

delphi.com.ar 11-05-2004 17:11:48

Eso depende del hardware, si tienes un Motherboard con una fuente relativamente moderna (no recuerdo como se llaman los modelos de las fuentes que soportan eso), desde WinMe en adelante se apagan solas.

Saludos!

mrmanuel 11-05-2004 17:19:39

Hola.

Yo ademas de apagar, quiero poder encender los equipos.


Respecto a problema del apagado, hay trucos en internet que te pueden solucionar el problema, hace poco encontré uno sobre le mismo tema pero para Xp, mira a ver si te vale:

http://www.terra.es/personal8/mabely...istemaPZ.htm#1

Si no te vale puede ser que tu placa Base no acepte bien el apagado en los equipos con win2000.

PD: Podrías decirme como usas el "ExitWindowsEx()" para apagarlos en red? a lo mejor me sirve para XP.

Gracias

delphi.com.ar 11-05-2004 17:23:39

Cita:

Empezado por mrmanuel
Yo ademas de apagar, quiero poder encender los equipos.

Encender es mucho mas fácil, no necesitas privilegios, solo necesitas que el HardWare soporte "WakeUpLan" y envías un mensaje a la red con el MacAddress del equipo que quieras encender. Tengo este código hecho pero VB, si te interesa te lo paso.

Saludos!

mrmanuel 11-05-2004 17:42:34

Cita:

Empezado por delphi.com.ar
Tengo este código hecho pero VB, si te interesa te lo paso.

La verdad que se me lo pasas, ahora un monton de tiempo, por lo menos mientras investigo como hacerlo en delphi, para crear un único ejecutable que encienda y apague.

Así consigo relajar un poco al jefe :mad: , que como todos, quieren el trabajo para ayer. :D :D

Gracias por adelantado.

delphi.com.ar 11-05-2004 17:54:43

Ups.. me acabo de fijar y el código que tengo aquí es solo el del la máquina que iba a ser encendida, el otro código lo tengo en otra oficina a la cual no estoy asistiendo.
Igualmente encotré este código en la Web (obviamente no lo he probado, eso lo dejo para tí):
Código Delphi [-]
uses
  WinTypes, Messages, SysUtils, Classes, IdBaseComponent, 
  IdComponent, IdUDPBase, IdUDPClient; 


Function HexToInt(S:String): LongInt;
const
  DecDigits: Set Of '0'..'9' = ['0'..'9'];
  HexVals: Array [0..$F] Of Integer = (0, 1, 2, 3, 4, 5, 6, 7, 
     8, 9, $A, $B, $C, $D, $E, $F);
  UpCaseHexLetters: Set Of 'A'..'F' = ['A'..'F'];
  LowCaseHexLetters: Set Of 'a'..'f' = ['a'..'f'];
var
  v: LongInt;
  i: integer;
  LookUpIndex: integer;
begin
  if length(S) <= 8 then begin
    v := 0;
    for i := 1 to length(S) do begin
       {$R-}
         v := v Shl 4;
       {$R+}
       if S[i] in DecDigits then begin
          LookUpIndex := Ord(S[i]) - Ord('0');
       end
       else begin
          if S[i] in UpCaseHexLetters then begin
             LookUpIndex := Ord(S[i]) - Ord('A') + $A;
          end
          else begin
             if S[i] in LowCaseHexLetters then begin
                LookUpIndex := Ord(S[i]) - Ord('a') + $A;
             end
             else begin
                LookUpIndex := 0;
             end;
          end;
       end;
       v := v Or HexVals[LookUpIndex];
    end;
    result := v;
  end
  else begin
    result := 0;
  end;
end;

procedure WakeUPComputer(aMacAddress: string);
var
  i, j: Byte;
  lBuffer: array[1..116] of Byte;
  lUDPClient: TIUDPClient;
begin
  try
    for i := 1 to 6 do begin
      lBuffer[i] := HexToInt(aMacAddress[(i * 2) - 1] + 
         aMacAddress[i * 2]);
    end;
    lBuffer[7] := $00;
    lBuffer[8] := $74;
    lBuffer[9] := $FF;
    lBuffer[10] := $FF;
    lBuffer[11] := $FF;
    lBuffer[12] := $FF;
    lBuffer[13] := $FF;
    lBuffer[14] := $FF;
    for j := 1 to 16 do begin
      for i := 1 to 6 do begin
        lBuffer[15 + (j - 1) * 6 + (i - 1)] := lBuffer[i];
      end;
    end;
    lBuffer[116] := $00;
    lBuffer[115] := $40;
    lBuffer[114] := $90;
    lBuffer[113] := $90;
    lBuffer[112] := $00;
    lBuffer[111] := $40;
    try
      lUDPClient := TIdUDPClient.Create(nil);
      lUDPClient.BroadcastEnabled := true;
      lUDPClient.Host := '255.255.255.255';
      lUDPClient.Port := 2050;
      lUDPClient.SendBuffer(lBuffer, 116);
      writeln('Trying to wake-up remote host: ' + aMacAddress);
    finally
      lUDPClient.Free;
    end;
  except
   on E: Exception do writeln('There was an error');
  end;
end;

aram2r 11-05-2004 18:17:19

Los pc´s q apago desde delphi si son modernos con fuente y placa ATX...pero al apagarlos con ExitWindowsEx() o con InitiateSystemShutdown()...se kedan en la pantallita de 'AHORA PUEDE APAGAR SU EQUIPO....etc'
A vosotros no os pasa?????

Para apagarlos en red no utilizo ExitWindowsEx() utilizo InitiateSystemShutdown() y el unico problema q tengo es ese...q no se apagan del todo se kedan en la pantallita de marras!!!!


El codigo q utilizo es el siguiente:

Código Delphi [-]
function Tform1.CierraWindows(RebootParam: Longword): Boolean;
var
  TTokenHd: THandle;
  TTokenPvg: TTokenPrivileges;
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;
  tpResult: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    tpResult := OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
    TTokenHd);
    if tpResult then
    begin
      tpResult := LookupPrivilegeValue(nil,
      SE_SHUTDOWN_NAME,
      TTokenPvg.Privileges[0].Luid);
      TTokenPvg.PrivilegeCount := 1;
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;
      if tpResult then
        Windows.AdjustTokenPrivileges(TTokenHd,
      False,
      TTokenPvg,
      cbtpPrevious,
      rTTokenPvg,
      pcbtpPreviousRequired);
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  CierraWindows(EWX_POWEROFF);
end;

Tambien he probado EWX_SHUTDOWN, EWX_EXFORCE..etc..etc


Gracias.

mrmanuel 13-05-2004 11:50:43

Hola

He estado probando el código de "aram2r" y se aplica al PC desde el que se ejecuta. ¿Como lo haces para apagar uno en la red?.

He estado probando en Win Me y no me funciona correctamente. lo que hace es reinciar la sesión.

de todas formas lo pruebo en otras plataformas.

gracias

aram2r 14-05-2004 09:00:30

Hola mrmanuel...ese no es el codigo q utilizo para apagarlos en red...para la red utilizo el initiateSystemShutDown()...conforme tu lo tienes escrito en el primer mensaje:
Código Delphi [-]
InitiateSystemShutdown(
       LPTSTR lpMachineName,// address of name of computer to shut down
       LPTSTR lpMessage,// address of message to display in dialog box
       DWORD dwTimeout,// time to display dialog box
       BOOL bForceAppsClosed,// force applications with unsaved changes flag
       BOOL bRebootAfterShutdown// reboot flag
       );

Por ejemplo:

Código Delphi [-]
InitiateSystemShutdown(
       192.168.1.2,
       '',
       0,
       True,
       False
       );

Esto a mi me funciona....pero mi usuario es administrador de dominio..no he probado si ejecutando el programa con un usuario restringido funcionaria


La franja horaria es GMT +2. Ahora son las 17:37:14.

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