Autor Beitrag
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Do 17.10.02 11:42 
Ich habe dieses Thema schon einmal geposted und folgenden Code erhalten. Doch ist mir dieser Code zu unsicher, da er sich auf die "Netzwerkumgebung" von Windows bezieht. Bei mir kam es häufig vor, das ein Computer in meinem Netz zwar lief und auch erreichbar war, doch nicht in der Netzwerkumgebung zu finden war und somit auch unsichtbar für diese Routine.
Da das ganze auch mit Dynamischen IPs funktionieren soll, kann ich nicht einfach den ganzen Berreich von z.B. 192.168.113.1 - ... . 255 durchpingen. Diese Methode ist zumal noch sehr langsam.
Also, meine Frage, gibt es eine Möglichkeit, die sicherer ist, als die unten stehende? Gibt es überhaupt eine andere Möglichkeit?
ausblenden volle Höhe Quelltext
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:
81:
82:
83:
type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..100] of TNetResource;

Function CreateNetResourceList(ResourceType: DWord;
                               NetResource: PNetResource;
                               out Entries: DWord;
                               out List: PNetResourceArray): Boolean;
var EnumHandle: THandle;
    BufSize: DWord;
    Res: DWord;
begin
Result := False;
List := Nil;
Entries := 0;
if WNetOpenEnum(RESOURCE_GLOBALNET, ResourceType,0,NetResource,EnumHandle) = 
NO_ERROR
then begin
     try
      BufSize := $4000;   // 16 kByte
      GetMem(List, BufSize);
      try
        repeat
          Entries := DWord(-1);
          FillChar(List^, BufSize, 0);
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
          if Res = ERROR_MORE_DATA
          then begin
               ReAllocMem(List, BufSize);
               end;
        until Res <> ERROR_MORE_DATA;
        Result := Res = NO_ERROR;
        if not Result
        then begin
             FreeMem(List);
             List := Nil;
             Entries := 0;
             end;
      except
        FreeMem(List);
        raise;
      end;
    finally
      WNetCloseEnum(EnumHandle);
    end;
  end;
end;

procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: 
TStrings);
procedure ScanLevel(NetResource: PNetResource);
var
  Entries: DWord;
  NetResourceList: PNetResourceArray;
  i: Integer;
begin
  if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) 
then try
    for i := 0 to Integer(Entries) - 1 do begin
      if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
         (NetResourceList[i].dwDisplayType = DisplayType) then begin
        List.AddObject(NetResourceList[i].lpRemoteName,
                       Pointer(NetResourceList[i].dwDisplayType));
      end;
      if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
        ScanLevel(@NetResourceList[i]);
    end;
  finally
    FreeMem(NetResourceList);
  end;
end;
begin
  ScanLevel(Nil);
end;

Procedure TForm1.Button1Click(Sender: TObject);
var LB : TStringList;
begin
LB:= TStringList.Create;
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, LB);
Showmessage('Alle Rechner im Netz'  + #10#13 + LB.Text);
LB.Free;
end;

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...