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?
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; |