![]() |
Alle Arbeitsgruppen, alle Rechner und dann alle freigaben?
Hallo!
also ich möchte mit Hellwalker gern ein Programm schreiben dass das NEtzwerk nach Arbeitsgruppen durchsucht, dann alle Rechner finded und schließlich alle Freigaben aufließtet. Dass ich am Ende alle Rechner-Freigaben nach Dateien Durchstöbern kann. Meines Wissens müsste dass ja mit ein paar API Befehlen möglich sein... bräuchte ein hinweiße des Handlings - Theoretisch funktionierts ja - hab au kein problem mit rekursiver Programmierung. Lediglich happerts bei mir an der Geringen API kenntnis. also - bin gespannt auf Antworten thx |
Moin Zerolith,
da kommen für Dich wohl am ehesten die Funktionen WNetOpenEnum, WNetEnumResource und WNetCloseEnum in Frage. Eigentlich müsstest Du zu denen hier auch Beispiele finden. |
aha ? :shock:
:| kein plan - -n paar bespiele - find nix passendes mit der boardsuche... schau mal morgen was is ne gute Quelle? MSDN? PSDK? DelphiHilfe? |
Zitat:
Suche im Forum: Schau mal ![]() |
Was ist Hellwalker?
Noch nie gehört! |
Moin fossi,
Zitat:
|
Thx @ Christian
werd mir das mal zu gemüte führen cya |
Hier mal als Basis:
Delphi-Quellcode:
Dieser Code listet alle Rechner im Netz auf.
function TThreadGetComputer.RechnerInWG(lpnr: PNetResource): Boolean;
procedure AddComputerToList(Value: TNetResource); begin strRemoteName := Value.lpRemoteName; if Value.dwDisplayType <> RESOURCEDISPLAYTYPE_SERVER THEN Exit; ListBox.Items.Add(strRemoteName); end; const // RESOURCE_CONNECTED RESOURCE_CONTEXT RESOURCE_GLOBALNET RESOURCE_REMEMBERED c_dwScope = RESOURCE_GLOBALNET; // RESOURCETYPE_ANY RESOURCETYPE_DISK RESOURCETYPE_PRINT c_dwType = RESOURCETYPE_DISK; var cbBuffer: DWORD; hEnum, dwResult, dwResultEnum : DWORD; lpnrLocal : array [0..16384 div SizeOf(TNetResource)] of TNetResource; i : Integer; cEntries : Longint; begin // // basiert auf Microsoft Beispiel "Enumerating Network Resources" in C++ // // [url]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/networks_77sj.asp[/url] // cbBuffer := 16384; centries := -1; dwResult := WNetOpenEnum( c_dwScope, c_dwType, 0, // 0 = All resources lpnr, hEnum); if dwResult <> NO_ERROR then begin Result := False; // Fehlerbehandlung('Fehler bei WNetOpenEnum (%d)',[dwResult]); Exit; end; FillChar( lpnrLocal, cbBuffer, 0 ); dwResultEnum := WNetEnumResource(hEnum, DWORD(cEntries), @lpnrLocal, cbBuffer); if dwResultEnum = NO_ERROR then begin // dwResultEnum = NO_ERROR for i := 0 to cEntries - 1 do begin AddComputerToList(lpnrLocal[i]); if (c_dwScope = RESOURCE_GLOBALNET) AND (RESOURCEUSAGE_CONTAINER = (lpnrLocal[i].dwUsage AND RESOURCEUSAGE_CONTAINER)) AND (Not Terminated) then RechnerInWG(@lpnrLocal[i]); end; end // dwResultEnum = NO_ERROR else begin // dwResultEnum <> NO_ERROR IF dwResultEnum <> ERROR_NO_MORE_ITEMS THEN begin Result := False; // Fehlerbehandlung (Format('Fehler bei WNetEnumResource (%d)',[dwResultEnum])); Exit; end; end; // dwResultEnum <> NO_ERROR dwResult := WNetCloseEnum(hEnum); if dwResult <> NO_ERROR then begin Result := False; // Fehlerbehandlung (Format('Fehler bei WNetCloseEnum (%d)',[dwResult])); Exit; end; Result := True; end; |
ehm - was muss ich der Funktion übergeben?
|
NIL
|
ups *G*
thx - funktioniert.... und wie kann ich alle Arbeitsgruppen scannen? |
Ich vermute mal, hier liegt der Schlüssel:
Delphi-Quellcode:
Schau mal ins SDK, dass müsste Dir da weiterhelfen.
// RESOURCE_CONNECTED RESOURCE_CONTEXT RESOURCE_GLOBALNET RESOURCE_REMEMBERED
c_dwScope = RESOURCE_GLOBALNET; |
k - thx!
|
Moin Zusammen,
die Resourcen sind strukturiert.
Solange eine aufgezählte Resource die Usage RESOURCEUSAGE_CONTAINER hat, kann man darin suchen. Man muss eigentlich "nur" noch filtern (durch Angabe/Überprüfung von Type, DisplayType und Usage) was man haben will. |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
mhh.. ich hab ein ähnliches problem:
ich will alle rechner der netzwerkes in einem ListView auflisten... aber mit dem code hier komme ich nicht ganz klar :-( gibt es noch eine andere möglichkeit? |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
NetServerEnum und WNetEnumResource benutzen
|
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
nur wie?
das is mein problem |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
Geh mal auf meine Seite und schau dir den Source von LoggedOn2 an. Da findest du ein Beispiel zu NetServerEnum(). Ist glaub ich in der Datei LoggedOnFunc.pas
Für die andere Funktion haste ja weiter oben schon Beispiele. |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
dein quellcode lässt sich bei mir net compilieren,er meckert bei:
Code:
Error:
...
VAR "NIL_HANDLE: Integer ABSOLUTE 0;" ( << die zeile mag er net) NetApiBufferFree: TNetApiBufferFree = NIL; //NT31+ NetServerEnum: TNetServerEnum = NIL; //NT31+ ... [Error] LoggedOnFunc.pas(26): Variable name expected auf der LoggedOnFun.pas |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
Hier ist Dein Angriffspunkt:
Delphi-Quellcode:
ListBox.Items.Add(strRemoteName);
procedure AddComputerToList(Value: TNetResource);
begin strRemoteName := Value.lpRemoteName; if Value.dwDisplayType <> RESOURCEDISPLAYTYPE_SERVER THEN Exit; ListBox.Items.Add(strRemoteName); end; Dann brauchst Du nur noch die Funktion aufrufen:
Delphi-Quellcode:
RechnerInWG(NIL)
|
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
das is alles O.o
mehr brauchts dazu net? oder muss ich das in den alte code einfügen? achja:und wenn das alles is: tuts das unter win9x/2000/XP? |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
@Assarbad: Dein Source ist für den C++ Builder? Damit kann Delphi doch nix anfangen, oder?
@webhuhn: Ich bezog mich auf die erste Seite dieser Diskussion. Da hatte ich den Code gepostet. Schaue da noch mal nach, Du musst nur noch die uses ergänzen, bis er nicht mehr meckert. Gehen sollte es unter allen Systemen. |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
achso, danke :D
dass es unter allen systeme läuft wäre gut ,weil das, was ich im moment hab tuts unter Win9X irgendwie net.. :-( edit: mhh.. der meckert :( welche uses muss ich ergänzen? ShellApi hab ich ergänz aber funktionieren tuts net |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
so sollte es tun (aber jetzt nicht getestet):
Delphi-Quellcode:
Aber Achtung! Bei großen Netzwerken kann das eine Weile dauern.
unit Unit1;
interface uses Windows; implementation function RechnerInWG(lpnr: PNetResource): Boolean; procedure AddComputerToList(Value: TNetResource); var strRemoteName: String; begin strRemoteName := Value.lpRemoteName; if Value.dwDisplayType <> RESOURCEDISPLAYTYPE_SERVER THEN Exit; ListBox.Items.Add(strRemoteName); end; const // RESOURCE_CONNECTED RESOURCE_CONTEXT RESOURCE_GLOBALNET RESOURCE_REMEMBERED c_dwScope = RESOURCE_GLOBALNET; // RESOURCETYPE_ANY RESOURCETYPE_DISK RESOURCETYPE_PRINT c_dwType = RESOURCETYPE_DISK; var cbBuffer: DWORD; hEnum, dwResult, dwResultEnum : DWORD; lpnrLocal : array [0..16384 div SizeOf(TNetResource)] of TNetResource; i : Integer; cEntries : Longint; begin // // basiert auf Microsoft Beispiel "Enumerating Network Resources" in C++ // // [url]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/networks_77sj.asp[/url] // cbBuffer := 16384; centries := -1; dwResult := WNetOpenEnum( c_dwScope, c_dwType, 0, // 0 = All resources lpnr, hEnum); if dwResult <> NO_ERROR then begin Result := False; // Fehlerbehandlung('Fehler bei WNetOpenEnum (%d)',[dwResult]); Exit; end; FillChar( lpnrLocal, cbBuffer, 0 ); dwResultEnum := WNetEnumResource(hEnum, DWORD(cEntries), @lpnrLocal, cbBuffer); if dwResultEnum = NO_ERROR then begin // dwResultEnum = NO_ERROR for i := 0 to cEntries - 1 do begin AddComputerToList(lpnrLocal[i]); if (c_dwScope = RESOURCE_GLOBALNET) AND (RESOURCEUSAGE_CONTAINER = (lpnrLocal[i].dwUsage AND RESOURCEUSAGE_CONTAINER)) then RechnerInWG(@lpnrLocal[i]); end; end // dwResultEnum = NO_ERROR else begin // dwResultEnum <> NO_ERROR IF dwResultEnum <> ERROR_NO_MORE_ITEMS THEN begin Result := False; // Fehlerbehandlung (Format('Fehler bei WNetEnumResource (%d)',[dwResultEnum])); Exit; end; end; // dwResultEnum <> NO_ERROR dwResult := WNetCloseEnum(hEnum); if dwResult <> NO_ERROR then begin Result := False; // Fehlerbehandlung (Format('Fehler bei WNetCloseEnum (%d)',[dwResult])); Exit; end; Result := True; end; end. |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
erstmal danke :D
aber warum meckert er da :
Code:
das da:
procedure AddComputerToList(Value: TNetResource);
var strRemoteName: String; begin strRemoteName := Value.lpRemoteName; if Value.dwDisplayType <> RESOURCEDISPLAYTYPE_SERVER THEN Exit; ListBox.Items.Add(strRemoteName); end; [Error] Unit1.pas(30): Undeclared identifier: 'ListBox' [Error] Unit1.pas(30): Missing operator or semicolon [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas' ? thx 4 hlp |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
Das ist die Listbox, die die Routine befüllen will. Die musst Du natürlich angeben, also z.B.:
Delphi-Quellcode:
Form1.ListBox1.Items.Add(strRemoteName);
|
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
hatte mich einfach vertippt :-(
sry :( tuts jetzt, danke nochmal :D #edit: auch auf 98 :D BIG THX :D |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
hi
ich bins ( schon wieder ;D ) gibt es auch eine möglichkeit den Progress des Rechnersuchens mit ner Progressbar darzustellen? thx 4 hlp |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
Zitat:
|
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
Moin!
werden auch Rechner mit Linux aufgelistet?? |
Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
Es werden alle die Rechner angezeigt, die dir die Netzwerkumgebung anzeigt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz