Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Web & réseau
Web & réseau Développement web et programmation réseau avec Delphi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 29/01/2009, 13h59   #1
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut Liste des machines sur un réseau local (tout le réseau de Win)

Bonjour,

J'aimerais savoir comment explorer (connaître) la liste des domaines et machines de mon réseau local.
J'ai écrit (plutôt piqué) le code suivant qui ne me permet que d'afficher dans un TListBox les machines se situant dans le domaine où je suis:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function ExcludeDoubleBackSlach( NomReseau : string ) : string;
var
  I : Integer;
  Temp : string;
begin
  Temp := '';
  if ( lstrlen( PChar( NomReseau) ) < 4 ) then
  begin
      Result := NomReseau;
      Exit;
  end;
  if ( ( NomReseau[1] = '\' ) and (NomReseau[2] = '\' ) ) then
  begin
    for I := 3 to lstrlen( PChar( NomReseau) ) do Temp := Temp + NomReseau[I];
    Result := Temp;
  end else
    Result := NomReseau;
end;
 
function RefreshPc : Boolean;
var
  hEnum    : DWORD;
  dwResult : DWORD;
  cEntries : DWORD;
  cbBuffer : DWORD;
  Nom      : string;
  IP       : string;
  Com      : string;
  I        : Integer;
  lpnr     : PNetResource;
begin
  Result   := False;
  cEntries := $FFFFFFFF;
  cbBuffer := 16384;
 
  lpnr := PNETRESOURCE( GlobalAlloc(GPTR, cbBuffer) );
 
  if ( WNetOpenEnum( RESOURCE_CONTEXT, RESOURCETYPE_ANY, 0, lpnr, hEnum ) <> NO_ERROR ) then Exit;
 
  dwResult := WNetEnumResource( hEnum, cEntries, lpnr, cbBuffer );
  if (dwResult <> NO_ERROR) then Exit;
  Inc( lpnr );
 
  { On boucle sur toute les machines trouvées }
  for I := 0 to ( cEntries - 1 ) do
  begin
 
    Nom := ExcludeDoubleBackSlach( lpnr^.lpRemoteName );   // Nom de la machine (dont on enlève les '\\' au début)
    IP  := HostToIP( Nom );   // IP de la machine
    Com := lpnr^.lpComment;   // Commentaire sur la machine
    Form1.ListBox1.Items.Add(Nom+'    '+Com);
    Inc( lpnr );
  end;
  // GlobalFree( PNETRESOURCE( lpnr ) );
  WNetCloseEnum( hEnum );
end;
Mon but c'est de connaitre toutes les machines comme Tout le réseau du Favoris réseau de Windows XP
  Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2009, 11h41   #2
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Dev/For/Vte/Ass

Informations forums :
Inscription : août 2008
Messages : 1 499
Points : 1 059
Points : 1 059
Cela peux surement t'aider :


FAQ


BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2009, 12h32   #3
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Merci pour le lien mais c'est pas vraiment ça que je cherche même si c'est intéressant de relever toutes les partages dans mon réseau local

Je veux en fait faire Tout le réseau > Réseau Ms Windows
Bon, je vais m'inspirer de cette FAQ!
  Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2009, 14h30   #4
ALWEBER
Membre chevronné
 
Inscription : mars 2006
Messages : 618
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 618
Points : 686
Points : 686
Si tout ton réseau MS-Windows est en Active Directory tu peux utiliser l'annuaire LDAP.
Voir sur google "adsicode LDAP"
ALWEBER est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2009, 17h29   #5
Andnotor
Rédacteur/Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 856
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 856
Points : 5 968
Points : 5 968
En utilisant RESOURCE_CONTEXT, tu ne vas énumérer que les machines du domaine dans lequel tu te trouves. Remplace-le par RESOURCE_GLOBALNET.

Ensuite, ta fonction doit être récursive si (dwUsage and RESOURCEUSAGE_CONTAINER) > 0.

Copie ce code dans une nouvelle unité:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
unit Unit2;
 
interface
 
uses Windows;
 
type
  TEnumNetworkProc = procedure(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean) of object;
 
procedure EnumNetwork(const aEnumNetworkProc :TEnumNetworkProc; const aScope :dword = RESOURCE_GLOBALNET; const aType :dword = RESOURCETYPE_ANY);
 
implementation
 
//Procédure récursive
procedure DoEnumNetwork(const aContainer :Pointer;
                        const aEnumNetworkProc :TEnumNetworkProc;
                        const aScope :dword;
                        const aType  :dword;
                        const aLevel :byte);
type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array [0..0] of TNetResource;
var
  NetHandle    :THandle;
  NetResources :PNetResourceArray;
  NetResult    :dword;
  Size, Count, i :Cardinal;
  Continue     :boolean;
begin
  Continue := TRUE;
 
  NetResult := WNetOpenEnum(aScope, aType, 0, aContainer, NetHandle);
 
  if NetResult = NO_ERROR then
  try
    //Taille de base
    Size := 50 *SizeOf(TNetResource);
    GetMem(NetResources, Size);
 
    try
      while Continue do
      begin
        Count := $FFFFFFFF;
        NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size);
 
        //Taille insuffisante ?
        if NetResult = ERROR_MORE_DATA
        then ReallocMem(NetResources, Size)
        else Break;
      end;
 
      //Enumère
      if NetResult = NO_ERROR then
        for i := 0 to Count - 1 do
        begin
          //Callback
          if Assigned(aEnumNetworkProc) then
          begin
            aEnumNetworkProc(NetResources^[i], aLevel, Continue);
            if not Continue then Break;
          end;
 
          //Appel récursif
          if (NetResources^[i].dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then 
            DoEnumNetwork(@NetResources^[i], aEnumNetworkProc, aScope, aType, aLevel +1);
        end;
    finally
      FreeMem(NetResources, Size);
    end;
  finally
    WNetCloseEnum(NetHandle);
  end;
end;
 
procedure EnumNetwork(const aEnumNetworkProc: TEnumNetworkProc; const aScope, aType: dword);
begin
  DoEnumNetwork(nil, aEnumNetworkProc, aScope, aType, 0);
end;
 
end.
Dans ta fiche, tu crées une procédure Callback qui sera appelée par l'énumération. Dans l'exemple ci-dessous, on rempli un ListBox indenté avec les domaines (ou groupes de travail) et les machines.
En jouant sur les paramètres et les tests, tu peux afficher les imprimantes, les partages, etc.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;
 
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    procedure EnumNetworkProc(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
procedure TForm1.EnumNetworkProc(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean);
begin
  if aNetResource.dwDisplayType in [RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER] then
    ListBox1.Items.Add(StringOfChar(' ', aLevel*4) +aNetResource.lpRemoteName);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  EnumNetwork(EnumNetworkProc, RESOURCE_GLOBALNET, RESOURCETYPE_DISK);
end;
 
end.
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2009, 02h11   #6
anapurna
Membre Expert
 
Avatar de anapurna
 
Développeur informatique
Inscription : mai 2002
Messages : 1 581
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2002
Messages : 1 581
Points : 1 914
Points : 1 914
salut

voir ici
__________________
Citation:
Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
Blaise Pascal
PS : n'oubliez pas le tag
anapurna est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Mettre Résolu
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h56.


 
 
 
 
Partenaires

Hébergement Web