Problemet med den funktion som borrisholt gav mig er at på store Netværk (300 maskiner) tager det en evighed. Dette er selvfølgelig ikke borrisholt\'s skyld men derimod Windows der generelt ikke har ret gode ydelser over Windows netværket.
Derfor har jeg besluttet at jeg vil give mulighed for at indskrænke netværket lidt ved at man istedet specificerer en Workroup i funktionen, og den så lister computere og shares herunder.
Men for at gøre dette er det nødvendigt at man i funktionen (http://www.eksperten.dk/spm/52688) kan indtaste en workgroup som listningen skal foregå under og at den ikke også lister alle andre workgroups på netværket (da det er dette der er tidsslugeren på store netværk)..
Håber der er noget der kan lade sig gøre, for jeg har ingen anelse om hvordan :)
Prøv at kikke lidt her : http://www.mvps.org/win32/ Det er godt nok C++, men da det meste er API kald, skulle det nok være til at \"oversætte\" til Delphi. Efter hvad jeg kan se, så er der noget der hedder \"NetShareEnum\"; Det er måske dét du leder efter ?
uhm.. der er en del ting jeg ikke har helt styr på i den kode (har aldrig arbejdet med C++), ville det være muligt om du evt. kunne oversætte den for mig og se om den virker?
Prøv at slå \"NetShareEnum\" på i Win32.hlp filen. Jeg har et fungerende eksempel på at få shares på en bestemt server. Men det er C++; og jeg kan ikke lige oversætte...
function NetShareEnum(const pszServer: LPWSTR; sLevel: longint; var p:PShareInfo502 ;var cbBuffer: longint; var pcEntriesRead: longint; var pcTotalAvail:longint;var hEnum:HWND): NET_API_STATUS; stdcall;
implementation
{$R *.DFM}
const NetApi32=\'NetApi32.dll\';
function NetShareEnum; external NetApi32 name \'NetShareEnum\';
if EntriesRead>0 then begin for i:=0 to EntriesRead-1 do begin memo1.lines.Add(string(p^.shi502_netname)+\'/\'+ string(p^.shi502_remark)+\'/\'+ intToStr(p^.shi502_max_uses)+\'/\'+ intToStr(p^.shi502_current_uses)+\'/\'+ string(p^.shi502_path) ); inc(p); end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin hest(\'GOOFY\'); end;
Jeg har lige snakket med en og han siger at man ikke skal kalde DLL\'en direkte(pga. kaldene er forskellige fra NT til 9x, bruger selv 9x så det er nok derfor det ikke virker), men istedet bruge WNetOpenEnum og WNetEnumResource.
Jeg ved dog ikke om det siger dig så meget (jeg har ikke selv arbejdet med WNETXXXX så det siger nemlig ikke mig ret meget :))
SNOWBALL >> Her er et lille program det kan fortælle dig hvilken slags Netværks resourse du har fat i .. Hvis den så er \"forkert\" kan du jo blot stoppe rekusionen ....
procedure TNetEnumThread.Execute; begin TreeNode:=nil; LoadNetNode(nil); end;
procedure TNetEnumThread.AddChildNode; begin TreeNode:=MainForm.TV.Items.AddChild(TreeNode,ChildNode); end;
procedure TNetEnumThread.LoadNetNode(NetNode: PNetResourceA); var hEnum : THandle; Count,BufSize, Usage: DWORD; NR,Buf: PNetResourceA; R: Integer; CurrentNode: TTreeNode; begin R:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0{RESOURCEUSAGE_CONTAINER},NetNode,hEnum); if R <> NO_ERROR then exit;
BufSize:=InitialSize; GetMem(Buf,BufSize); try while True do begin Count:=$FFFFFFFF; // I wish to read ALL items R:=WNetEnumResource(hEnum,Count, Buf, BufSize);
if R = ERROR_MORE_DATA then // Oops ! The InitialSize is too small ! begin Count:=$FFFFFFFF; // I wish to read ALL items FreeMem(Buf); GetMem(Buf,BufSize); R:=WNetEnumResource(hEnum,Count, Buf, BufSize); end;
if R = ERROR_NO_MORE_ITEMS then Break; // All items are processed if R <> NO_ERROR then Abort; // R is the error code. Process it!
NR:=Buf; while Count > 0 do begin CurrentNode:=TreeNode; // Remember current position
if NR.lpRemoteName <> nil then ChildNode:=StrPas(NR.lpRemoteName) else ChildNode:=\'\';
// Gather node information and display it in textual form ChildNode:=ChildNode+\' DisplayType=\'; case NR.dwDisplayType of RESOURCEDISPLAYTYPE_DOMAIN: ChildNode:=ChildNode+\'Domain\'; RESOURCEDISPLAYTYPE_GENERIC: ChildNode:=ChildNode+\'Generic\'; RESOURCEDISPLAYTYPE_SERVER: ChildNode:=ChildNode+\'Server\'; RESOURCEDISPLAYTYPE_SHARE: ChildNode:=ChildNode+\'Share\'; RESOURCEDISPLAYTYPE_GROUP: ChildNode:=ChildNode+\'Group\'; RESOURCEDISPLAYTYPE_NETWORK: ChildNode:=ChildNode+\'Network\'; RESOURCEDISPLAYTYPE_ROOT: ChildNode:=ChildNode+\'Root\'; RESOURCEDISPLAYTYPE_SHAREADMIN: ChildNode:=ChildNode+\'ShareAdmin\'; RESOURCEDISPLAYTYPE_DIRECTORY: ChildNode:=ChildNode+\'Directory\'; RESOURCEDISPLAYTYPE_TREE: ChildNode:=ChildNode+\'Tree\'; RESOURCEDISPLAYTYPE_NDSCONTAINER: ChildNode:=ChildNode+\'NDS Container\'; else ChildNode:=ChildNode+\'? (\'+IntToStr(NR.dwDisplayType)+\')\'; end;
if NR.dwScope = RESOURCE_GLOBALNET then // dwUsage member is usable in this case only begin ChildNode:=ChildNode+\' Usage=\';
Usage:=NR.dwUsage; if (Usage and RESOURCEUSAGE_CONNECTABLE) <> 0 then ChildNode:=ChildNode+\'Connectable;\'; Usage:=Usage and not RESOURCEUSAGE_CONNECTABLE;
if (Usage and RESOURCEUSAGE_CONTAINER) <> 0 then ChildNode:=ChildNode+\'Container;\'; Usage:=Usage and not RESOURCEUSAGE_CONTAINER;
if (Usage and RESOURCEUSAGE_NOLOCALDEVICE) <> 0 then ChildNode:=ChildNode+\'NoLocalDevice\'; Usage:=Usage and not RESOURCEUSAGE_NOLOCALDEVICE;
if (Usage and RESOURCEUSAGE_SIBLING) <> 0 then ChildNode:=ChildNode+\'Sibling\'; Usage:=Usage and not RESOURCEUSAGE_SIBLING;
if (Usage and RESOURCEUSAGE_ATTACHED) <> 0 then ChildNode:=ChildNode+\'Attached\'; Usage:=Usage and not RESOURCEUSAGE_ATTACHED;
if (Usage and RESOURCEUSAGE_RESERVED) <> 0 then ChildNode:=ChildNode+\'Reserved\'; Usage:=Usage and not RESOURCEUSAGE_RESERVED;
if Usage <> 0 then ChildNode:=ChildNode+\'? (\'+IntToHex(Usage,8)+\')\'; end;
// Check for dwType value ChildNode:=ChildNode+\' Type=\'; case NR.dwType of RESOURCETYPE_ANY: ChildNode:=ChildNode+\'Any\'; RESOURCETYPE_DISK: ChildNode:=ChildNode+\'Disk\'; RESOURCETYPE_PRINT: ChildNode:=ChildNode+\'Print\'; else ChildNode:=ChildNode+\'?\'; end;
// Analyze dwScope member ChildNode:=ChildNode+\' Scope=\'; case NR.dwScope of RESOURCE_CONNECTED: ChildNode:=ChildNode+\'Connected\'; RESOURCE_GLOBALNET: ChildNode:=ChildNode+\'Globalnet\'; RESOURCE_REMEMBERED: ChildNode:=ChildNode+\'Remembered\'; else ChildNode:=ChildNode+\'?\'; end;
// Add new node to the tree view - and do it in the main thread Synchronize(AddChildNode);
// Process subnodes LoadNetNode(NR);
TreeNode:=CurrentNode; // restore current position // after modification
// Go to the next record INC(NR); DEC(Count); end; end; finally WNetCloseEnum(hEnum); // Close handle FreeMem(Buf); // Free memory1 end; end;
procedure TMainForm.FormCreate(Sender: TObject); begin TNetEnumThread.Create(False); end;
Men det var faktisk noget lignende det jeg selv var kommet frem til :)
Nåh.. jeg lukker spørgsmålet
Tak for hjælpen
Mvh. _DJ_
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.