WAKE ON LAN

Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 - 28 août 2006 à 21:12
jeromefer Messages postés 11 Date d'inscription dimanche 14 janvier 2007 Statut Membre Dernière intervention 22 septembre 2008 - 19 févr. 2012 à 08:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39318-wake-on-lan

jeromefer Messages postés 11 Date d'inscription dimanche 14 janvier 2007 Statut Membre Dernière intervention 22 septembre 2008
19 févr. 2012 à 08:28
Bonjour a tous
Un grand merci pour cette tres bonne source.
Je confirme qu'elle est fonctionne tres bien.
Bravo !!
Jerome
botelec Messages postés 38 Date d'inscription vendredi 20 juin 2003 Statut Membre Dernière intervention 11 septembre 2010 1
7 mars 2009 à 19:15
Bonjour,

Un an et demi plus tard, je peux confirmer que le réveil d'une machine marche très bien et ce, même derrière un routeur.

Merci donc à tous pour cette source bien utile !
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
7 nov. 2006 à 15:23
La fonction est la suivante :

function SendARP( const DestIP: DWORD; const SrcIP: DWORD; const pMacAddr: PULONG; const PhyAddrLen: PULONG ) : DWORD; stdcall; external 'IPHLPAPI.DLL';

Elle permet de remonter des informations (adresse IP) en fonction de l'adresse MAC, en envoyant tout simplement une requete ARP.

La fonction déconne effectivement si l'adresse MAC n'existe pas sur le reseau, sinon comme çà je ne pourrai pas vous dire. Quel erreur avez vous exactement ?

PS : Sinon ce programme est la démo CodeSource, l'application complète se trouve sur Telecharger.com - Logiciel : "Morphee"

Merci
cs_Pierre42 Messages postés 19 Date d'inscription samedi 31 janvier 2004 Statut Membre Dernière intervention 22 novembre 2008
7 nov. 2006 à 14:48
Bonjour,

J'ai testé le systeme sur mon reseaux de 20 machines, ca marche nickel a une exeption pres lorsque je fait un copié coller de la procedure SendARP dans mon programme j'ai un message d'erreur lors de la recompilation

Felicitation
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
31 août 2006 à 08:14
Merci Francky23012301, toujours là pour me soutenir :-)

Sinon je reposterai un nouveau code, je sais pas quand mais j'améliorerai la lisibilité.

Par contre je suis surpris que tout le monde me dise "mon pc ne le permet pas"... c'est pourtant pas si récent que çà ?
Francky23012301 Messages postés 400 Date d'inscription samedi 6 août 2005 Statut Membre Dernière intervention 11 février 2016 1
31 août 2006 à 00:29
Salut Elguevel,

"Sinon comme d'habitude je m'apperçois que les sources réseaux n'interesse pas grand monde, pourtant c'est passionant le réseau non :-) ?" si si mais on en reste bouche bez

Je n'ai pas testé ton code : Arfff mon pc ne le permet pas.

Par contre ca m'a permis de m'interesser à un truc que je connaissais tres peu : Merci Elguevel.

Coté code : Nickel sauf un petit truc : il y a des fonctions assez spéciales (car c'est du réseau ^^) qui mériteraient peut etre d'etre commentées.

Allez un bon 9/10 pour ton taff ;).
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
30 août 2006 à 23:02
Arf merde... j'enchaine les boulettes en ce moment, mais j'ai mis ton nom en remerciement dans la fenetre de Crédit. Je corrigerai çà demain.

Sinon merci pour avoir pris le temps d'optimiser mes fonctions, je les trouvent nettement plus jolie (surtout tout tes algos mathématiques auquelles je n'accorde jamais assez d'importance). Et tu es mille fois excusé quant au "GetValueNames".

A chaque nouveau developpement je retiens néanmoins tes conseil ; par exemple ici tu remarquera que j'ai utilisé "Close" et non "Application.Terminate" comme tu me l'avais suggéré.

Sinon comme d'habitude je m'apperçois que les sources réseaux n'interesse pas grand monde, pourtant c'est passionant le réseau non :-) ?

Allé hop, je vais commencer à me pencher sur un autre code ...
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
30 août 2006 à 10:12
Voila fOxy j'ai mis en place les modifications que tu m'as faite, vraiment sympa :-)

Par contre tu t'es planté sur un truc, c'est pour recharger la liste via le registre.
Tu m'as corrigé en me donnant çà :

// on utilise directement Strings, pas besoin d'une liste temporaire
GetValueNames( Strings );

Mais en faite non, car dans ce cas je récupère les clés (0, 1, 2..) et non les valeurs (adresse MAC).

J'ai donc laissé mon système de liste temporaire (TStringList).

Aller Merci Bcp !!!
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
30 août 2006 à 08:12
Ah oui et puis pour le BIOS, si ta carte mère supporte biensure, il faut activer le Wake On LAN. Dans le BIOS il y à un menu alimentation, tu doit avoir en toute lette Wake On LAN, ba tu y active (Enabled).
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
30 août 2006 à 08:07
Un grand MERCI à fOxy : Tu as transformé mes fonctions toutes pourris en quelque chose de potable, je vais allé mettre çà a jour (et faire quelques modif au passage pour rendre le programme plus pratique).

365tib > Pour ce qui est du WiFi j'en sait rien, c'est une technologie à laquel je ne suis pas encore passé et qui ne m'interesse pas plus que çà. Et la carte réseau est normalement alimenté par la carte mère, mais là aussi coté HardWare je ne peux pas te répondre avec certitude ...
365tib Messages postés 27 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 31 janvier 2007
29 août 2006 à 23:55
Vous allez dire que je suis nul...

mais qu'est qui alimente la carte réseau???
Et est-que sa marche aussi avec les dongles wifi??
Tu dit qu'il faut modifier le BIOS??

si tu peut m'éclairé...

merci
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 août 2006 à 20:34
passont a ElgRegistre

quelques corrections a faire, il faut toujours penser a la souplesse et ne jamais utiliser la classe qui contient l'objet visé par une methode (Listbox > TStrings)

on declare donc ElgRegistre de cette façon :

// renvois true sir l'action c'est bien deroulée sinon false
function EcritListe(Strings : TStrings) : boolean;
function LireListe (Strings : TStrings) : boolean;

implementation

const
MORPHEE_LIST_KEY = 'Software\Elguevel\Morphee\';

function EcritListe(Strings : TStrings) : boolean;
var
I : Integer;
begin
result := false;
with TRegistry.Create do begin
try
RootKey := HKEY_CURRENT_USER;

// plus rapide, on efface directement la clef
if KeyExists(MORPHEE_LIST_KEY) then
DeleteKey(MORPHEE_LIST_KEY);

// on precise bien True pour CanCreate
// on verifie toujours que la clef est bien ouverte pour faire les manips.
if OpenKey(MORPHEE_LIST_KEY, True) then begin
for I := 0 to Strings.Count-1 do
WriteString(IntToStr(I), Strings.Strings[I]);
// on declare CloseKey ici bien qu'il n'y ai pas d'erreur de le mettre
// dans le finally, mais c'est inutile en cas d'erreur.
CloseKey;
result := true;
end;
finally
Free;
end;
end;
end;

function LireListe(Strings : TStrings) : boolean;
var
I : Integer;
begin
result := false;
with TRegistry.Create do begin
try
RootKey := HKEY_CURRENT_USER;
// on ne crée pas la clef ici, si elle est vide ça ne sert a rien d'aller plus loin.
if OpenKey(MORPHEE_LIST_KEY, false) then begin
Strings.BeginUpdate;
Strings.Clear;
// on utilise directement Strings, pas besoin d'une liste temporaire
GetValueNames( Strings );
Strings.EndUpdate;
CloseKey;
result := true;
end;
finally
Free;
end;
end;
end;



on modifie en consequence dans l'unité Main :

LireListe( ListMAC.Items );
EcritListe( ListMAC.Items );

on peu bien sur utiliser le retour des fonctions pour transmettre des messages de succés/echec a l'utilisateur.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 août 2006 à 20:11
ce qui reduit la procedure GoWOL


procedure GoWOL(const sAdresseMac : string );
var
StructWSA : WSAData;
Sckt : Integer;
Sckaddrin : sockaddr_in;
MagicPack : TMagicPack;
MagicLen : integer;
ArrayMac : TMacAddress;
OptionVal : Integer;
begin
OptionVal := 1;
FillChar( sckaddrin, SizeOf( sckaddrin ), #0 );

StrToMac(ArrayMac,sAdresseMac);
CreateMagicPack(ArrayMac,MagicPack);
MagicLen := 102;

try
if ( WSAStartup( MAKEWORD(2, 2), StructWSA ) = 0 ) then begin

Sckt := Socket( AF_INET, SOCK_DGRAM, IPPROTO_IP );

if ( Sckt <> INVALID_SOCKET ) then begin

Sckaddrin.sin_family := AF_INET;
Sckaddrin.sin_addr.s_addr := Longint( INADDR_BROADCAST );
Sckaddrin.sin_port := htons( 666 );

setsockopt( Sckt, SOL_SOCKET, SO_BROADCAST, PChar(@OptionVal), SizeOf(OptionVal) );

if ( connect( Sckt, Sckaddrin, 16 ) < 0 ) then begin
MessageBoxA( 0, PChar('Impossible de se connecter'), PChar('Stop'), MB_ICONWARNING );
Exit;
end;

sendto( Sckt, MagicPack, MagicLen, 0, Sckaddrin, SizeOf(Sckaddrin) );

closesocket( Sckt );
end else
MessageBoxA( 0, PChar('Impossible de créer la socket'), PChar('Stop'), MB_ICONWARNING );
end else
MessageBoxA( 0, PChar('Impossible d''initialiser la socket'), PChar('Stop'), MB_ICONWARNING );
finally
WSACleanup;
end;
end;
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 août 2006 à 19:57
tiens je t'ai refait quelques methodes performantes et clean pour manipuler les adresses mac et pour ameliorer celles de l'unitée Elg-WOL



type
TMacAddress = array[0..5] of byte;
TMagicPack = array[0..101] of byte;

// Adresse mac vers chaine
function MacToStr(const MacAddress : TMacAddress; const Delimiter : char = '-') : string;
var PResult : PChar;
i : integer;
const Digits: array[0..15] of Char = '0123456789abcdef';
begin
// une adresse MAC fait 17 caracteres de long
SetLength(Result, 17);
PResult := PChar(Result);

for I := 0 to 5 do begin
// on convertis l'octet en texte
PResult[0] := Digits[MacAddress[I] shr 4];
PResult[1] := Digits[MacAddress[I] and $F];
// on ajoute un delimiteur ou non
if i < 5 then begin
PResult[2] := Delimiter;
Inc(PResult,3);
end else
Inc(PResult,2);
end;
end;

// Interne, supprime le caractere 'chartoremove' de la chaine 's'
function DeleteChar(const S : string; const CharToRemove : char) : string;
var pR : PChar;
L,I : integer;
begin
SetLength(Result, length(S));
pR := PChar(Result);
L := 0;
for i := 1 to Length(S) do
if s[i] <> CharToRemove then begin
pR[0] := s[i];
Inc(pR);
Inc(L);
end;
SetLength(Result,L);
end;

// transforme une chaine representant une adresse MAC (ff-aa-cc-dd-ee-56) vers un TMacAddress
procedure StrToMac(var MacAddress : TMacAddress; const MacStr : string; const Delimiter : char = '-');
var i : integer;
s : string;
b1,b2 : byte;
begin
// on supprime le delimiteur
s := DeleteChar(MacStr,Delimiter);
// si la longeur est differente de 12 c'est qu'il y a un probleme
if Length(S) <> 12 then
exit;
for i := 0 to 5 do begin
// on recupere la valeur ordinal du caractere et on decremente pour obtenir une valeur
// entre 0 et 15
// shl 1 = *2 , un decalage est plus rapide qu'une multiplication
b1 := Ord(s[(i shl 1) + 1]) - 48;
b2 := Ord(s[(i shl 1) + 2]) - 48;
if b1 > 15 then dec(b1,39);
if b2 > 15 then dec(b2,39);

MacAddress[i] := (b1 shl 4) + (b2 and $F);
end;
end;


// convertis un MagicPack vers une liste de chaines
procedure MagicPackToStrings(const MagicPack : TMagicPack; Strings : TStrings);
var i : integer;
MA : TMacAddress;
begin
Strings.BeginUpdate;
for i := 0 to 16 do begin
// on copie directement 6 octets de la memoire a partir de l'index i*6 dans MA
Move(MagicPack[i*6],MA,6);
// puis on utilise MacToStr pour convertir la chaine
Strings.Add(MacToStr(MA,' '));
end;
Strings.EndUpdate;
end;


// cree un MagicPack a partir d'une adresse MAC (TMacAddress)
procedure CreateMagicPack(const MacAddress : TMacAddress; var MagicPack : TMagicPack);
var i : integer;
begin
// on remplis les 6 premier octets avec $FF
for i := 0 to 5 do
MagicPack[i] := $FF;

// on copie 16 fois les 6 octets de MacAddress dans MagicPack a l'index i*6
for i := 1 to 16 do
Move(MacAddress, MagicPack[i*6],6);
end;
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 août 2006 à 18:03
bah y'a un truc aussi, est-ce que ça fontionne sur reseaux routé ?

car le routeur a sa propre adresse mac et peu egalement offrir des services WOL parametrable (routeur qui coute cher).

le truc etant de savoir si le routeur ne contient pas un IDS agressif qui bloque les messages WOL, ou si il n'est pas paramétrés pour les bloquer.

Ensuite, toutes les CM ne fournisse pas les PME et certaines config n'ont pas été prevus pour, CAD le cable WOL n'est pas relié a la CM.

Mais ça reste toujours trés interressant d'un point de vus analyse de paquets et recuperation de la MAC.

Ensuite pour faire les tests, il faut deux machine reliées en reseaux et tester les fonctionnement avec diverse config (connexion par simple cable, switch, routeur ect...)

de plus, je crois qu'il y a un delai a respecter entre l'envois de deux evenements.
voir egalement les interractions entre les PME et la config BIOS en cas de coupure de courant (Stay off).

bref ... pas mal de tests et de boulot en perspectives.
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
29 août 2006 à 15:51
Je sais pas si c'est vraiment utile, au pire je peux y coupler avec un serveur Web afin de pouvoir démarrer son PC de n'importe où sur internet ...

Mais ce qui est frustrant avec ce genre de source, c'est que çà peux très bien fonctionner chez moi et pas chez certains, et afin de voir ce qui va ou ne va pas... j'ai besoin de la communauté :-)
Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 2
29 août 2006 à 15:32
Mais simais si ^^
Le problème c'est que les autres personnes ne se rendent pas compte de l'utilité de cet executable.
Moi j'enaurais bien l'utilité mais tant pis pour moi.
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
29 août 2006 à 15:12
Dommage, personne pourra me tester mon appli alors :-)
Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 2
29 août 2006 à 15:05
Exact !

Mon bios ne me permet pas de faire un WOL donc je ne peux pas tester cela correctement.

Et je n'ai pas d'autre PC à l'horizon pour tester cela.

Désolé
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
29 août 2006 à 14:19
L'histoire de la facture EDF, c'est de l'humour .. mais tu sait la consomation dépend aussi de ta configuration, donc çà dépend (y'en à qui sont mieux équipé que des réfrigirateur) !

Sinon pourquoi ne peux tu pas tésté le WakeOnLAN chez toi ? Matos trop obsolète ?
Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 2
29 août 2006 à 13:57
Par contre un tel programme peut augmenter votre factures EDF :-) ==> Je pense que tu sais très bien qu'un PC ne consomme pratiquement rien. Cela ne participe (mais participe quand même) que peu à la facture EDF de ta maison. Ton frigo utilise plus de ressource que lui ;-)

Mais bon celà n'a rien à voir avec la source, vraiment dommage que je puisse pas la tester cette source, et puis je pourrait même pas regrader la source si c'est poru hallucinner 3h devant sans rien comprendre :-D
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
29 août 2006 à 11:55
Voila j'ai corrigé les problèmes existant, et après test çà fonctionne bien. Par contre si on réteind la machine tout de suite derrière, quand on relance un "Wake Up" celle-ci ne se rallume pas... a voir !

Dite moi si çà fonctionne chez vous !
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
28 août 2006 à 22:14
J'en suis tout à fait conscient, et je ne parle pas ici des problèmes de sécurité. Car pour moi le Wake On Lan se limite à démarrer la machine, ce qui ne veut pas dire qu'on y aura necessairement accès par la suite.

Par contre un tel programme peut augmenter votre factures EDF :-)

Sinon demain je regarderai ce qui ne va pas dans mon code, mais à prioris plusieurs appels à Winsock plante mon application.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
28 août 2006 à 22:07
@Elguevel : Trés interressant! mais je dois quand meme faire une mise en garde que je te suggere de mettre en entete de ta presentation.

En gros, activer les evenements PME dans le bios diminue enorment la securitée de la machine et du reseaux. Il est donc recommendé de ne les activer que si on est réellement sur de sa securité et qu'on dispose de tout le materiel et competences necessaires pour l'utilisation de ces evenements.

En effet, il n'est pas rare que les modems/routeurs/switchs balances ces evenements de temps en temps ce qui reveille tout les ordis du reseaux qui sont donc impossible a arreter (sauf power off de l'alim).
de plus il n'y a aucun control d'identitée de la machine qui tente de reveiller l'ordinateur, donc un pirate/virus peu utiliser ces evenements pour penetrer dans le systeme.
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
28 août 2006 à 21:35
Je suis désolé mais j'vient de faire çà cet aprème, et j'mapperçoie que par rapport à ce que je fait d'habitude c'est un peu caca. Mais promis demain je remet çà d'aplomb et je corrigerai certaines erreurs qui plante le programme au bout d'un certain temps.

Also know as > Merci pour le com :-)

A+
Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 2
28 août 2006 à 21:12
Super ta source,

J'en avais déjà entendu parlais mais malehureusement je n'ai pas cette capacité à pouvoir réveiller mon PC par le WOL.

Mais sinon c'est assez utile pour réveiller un PC depuis n'importe quel PC et pas seulement de son réseau !

@+
Rejoignez-nous