Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Lucas Panny
    Invité(e)

    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

  2. #2
    Membre Expert Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    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 527
    Points : 1 024
    Points
    1 024

    Par défaut

    Cela peux surement t'aider :


    FAQ



  3. #3
    Lucas Panny
    Invité(e)

    Par défaut

    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!

  4. #4
    Membre chevronné
    Inscrit en
    mars 2006
    Messages
    633
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 633
    Points : 770
    Points
    770

    Par défaut

    Si tout ton réseau MS-Windows est en Active Directory tu peux utiliser l'annuaire LDAP.
    Voir sur google "adsicode LDAP"

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    septembre 2008
    Messages
    3 379
    Détails du profil
    Informations forums :
    Inscription : septembre 2008
    Messages : 3 379
    Points : 5 760
    Points
    5 760

    Par défaut

    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.

  6. #6
    Membre Expert Avatar de anapurna
    Développeur informatique
    Inscrit en
    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 987
    Points
    1 987

    Par défaut

    salut

    voir ici
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •