Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-05-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 21
mrmanuel Va por buen camino
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.
__________________
Un Saludo a todos/as
Responder Con Cita
  #2  
Antiguo 04-05-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 05-05-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 21
mrmanuel Va por buen camino
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.
__________________
Un Saludo a todos/as

Última edición por mrmanuel fecha: 11-05-2004 a las 11:19:09.
Responder Con Cita
  #4  
Antiguo 11-05-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 21
mrmanuel Va por buen camino
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
__________________
Un Saludo a todos/as
Responder Con Cita
  #5  
Antiguo 11-05-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
En un Win9x supongo
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #6  
Antiguo 11-05-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 11-05-2004
aram2r aram2r is offline
Miembro
 
Registrado: ene 2004
Posts: 81
Poder: 21
aram2r Va por buen camino
Red face

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
Responder Con Cita
  #8  
Antiguo 11-05-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #9  
Antiguo 11-05-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 21
mrmanuel Va por buen camino
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
__________________
Un Saludo a todos/as
Responder Con Cita
  #10  
Antiguo 11-05-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #11  
Antiguo 11-05-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 21
mrmanuel Va por buen camino
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 , que como todos, quieren el trabajo para ayer.

Gracias por adelantado.
__________________
Un Saludo a todos/as
Responder Con Cita
  #12  
Antiguo 11-05-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #13  
Antiguo 11-05-2004
aram2r aram2r is offline
Miembro
 
Registrado: ene 2004
Posts: 81
Poder: 21
aram2r Va por buen camino
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.

Última edición por aram2r fecha: 14-05-2004 a las 09:01:55.
Responder Con Cita
  #14  
Antiguo 13-05-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 21
mrmanuel Va por buen camino
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
__________________
Un Saludo a todos/as
Responder Con Cita
  #15  
Antiguo 14-05-2004
aram2r aram2r is offline
Miembro
 
Registrado: ene 2004
Posts: 81
Poder: 21
aram2r Va por buen camino
Wink

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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:48:30.


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
Copyright 1996-2007 Club Delphi