Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Alle Arbeitsgruppen, alle Rechner und dann alle freigaben? (https://www.delphipraxis.net/5604-alle-arbeitsgruppen-alle-rechner-und-dann-alle-freigaben.html)

Zerolith 12. Jun 2003 18:15


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

Christian Seehase 12. Jun 2003 18:28

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.

Zerolith 12. Jun 2003 19:55

aha ? :shock:

:|

kein plan - -n paar bespiele - find nix passendes mit der boardsuche...
schau mal morgen

was is ne gute Quelle?

MSDN? PSDK? DelphiHilfe?

Chewie 12. Jun 2003 20:10

Zitat:

Zitat von Zerolith
was is ne gute Quelle?

MSDN? PSDK? DelphiHilfe?

Die ersten beiden, das PSDK ist ja eh komplett im MDSN enthalten.

Suche im Forum: Schau mal hier.

fossi3 12. Jun 2003 20:23

Was ist Hellwalker?
Noch nie gehört!

Christian Seehase 12. Jun 2003 20:26

Moin fossi,

Zitat:

Zitat von fossi3
Was ist Hellwalker?

ein User des Forums ;-)

Zerolith 13. Jun 2003 08:34

Thx @ Christian

werd mir das mal zu gemüte führen

cya

Mario 13. Jun 2003 08:37

Hier mal als Basis:
Delphi-Quellcode:
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;
Dieser Code listet alle Rechner im Netz auf.

Zerolith 13. Jun 2003 10:10

ehm - was muss ich der Funktion übergeben?

Mario 13. Jun 2003 10:13

NIL

Zerolith 13. Jun 2003 10:18

ups *G*

thx - funktioniert....

und wie kann ich alle Arbeitsgruppen scannen?

Mario 13. Jun 2003 10:25

Ich vermute mal, hier liegt der Schlüssel:
Delphi-Quellcode:
// RESOURCE_CONNECTED RESOURCE_CONTEXT RESOURCE_GLOBALNET RESOURCE_REMEMBERED
c_dwScope = RESOURCE_GLOBALNET;
Schau mal ins SDK, dass müsste Dir da weiterhelfen.

Zerolith 13. Jun 2003 10:27

k - thx!

Christian Seehase 13. Jun 2003 10:37

Moin Zusammen,

die Resourcen sind strukturiert.
  1. Zuerst werden (mit nil) die Provider ermittelt (in reinen Windowsnetzen, wird man da nur einen erhalten, nämlich "Microsoft Windows-Netzwerk",
  2. dann die darin enthaltenen Domänen/Arbeitsgruppen (wenn man den Provider angibt),
  3. dann die darin enthaltenen Rechner (eben bei Angabe von Domäne bzw. Arbeitsgruppe, das wird bei dieser Funktion (WNetEnumResource) nicht weiter unterschieden,
  4. und, zu guter Letzt, die Freigaben der Rechner

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.

webhuhn 4. Aug 2003 00:17

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?

Assarbad 4. Aug 2003 00:53

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
NetServerEnum und WNetEnumResource benutzen

webhuhn 4. Aug 2003 00:55

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
nur wie?
das is mein problem

Assarbad 4. Aug 2003 00:58

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.

webhuhn 4. Aug 2003 01:02

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
dein quellcode lässt sich bei mir net compilieren,er meckert bei:

Code:
...
VAR
  "NIL_HANDLE: Integer ABSOLUTE 0;" ( << die zeile mag er net)
  NetApiBufferFree: TNetApiBufferFree = NIL; //NT31+
  NetServerEnum: TNetServerEnum = NIL; //NT31+
...
Error:
[Error] LoggedOnFunc.pas(26): Variable name expected


auf der LoggedOnFun.pas

Mario 4. Aug 2003 06:55

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
Hier ist Dein Angriffspunkt:
Delphi-Quellcode:
procedure AddComputerToList(Value: TNetResource);
begin
   strRemoteName := Value.lpRemoteName;
   if Value.dwDisplayType <> RESOURCEDISPLAYTYPE_SERVER THEN Exit;
   ListBox.Items.Add(strRemoteName);
end;
ListBox.Items.Add(strRemoteName);

Dann brauchst Du nur noch die Funktion aufrufen:
Delphi-Quellcode:
RechnerInWG(NIL)

webhuhn 5. Aug 2003 14:09

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?

Mario 5. Aug 2003 14:17

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.

webhuhn 5. Aug 2003 14:24

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

Mario 5. Aug 2003 14:29

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
so sollte es tun (aber jetzt nicht getestet):
Delphi-Quellcode:
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.
Aber Achtung! Bei großen Netzwerken kann das eine Weile dauern.

webhuhn 5. Aug 2003 14:35

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
erstmal danke :D

aber warum meckert er da :

Code:
procedure AddComputerToList(Value: TNetResource);
var strRemoteName: String;
begin
   strRemoteName := Value.lpRemoteName;
   if Value.dwDisplayType <> RESOURCEDISPLAYTYPE_SERVER THEN Exit;
   ListBox.Items.Add(strRemoteName);
end;
das da:

[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

Mario 5. Aug 2003 14:37

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

webhuhn 5. Aug 2003 14:42

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

webhuhn 5. Aug 2003 15:40

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

Mario 6. Aug 2003 07:17

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
Zitat:

Zitat von webhuhn
gibt es auch eine möglichkeit den Progress des Rechnersuchens mit ner Progressbar darzustellen?

Nicht das ich wüßte. Die Funktion ruft sich selbst solange auf, bis Windows keine Daten mehr bereit stellt. Nicht ohne Grund zeigt Windows, wenn man in die Netzwerkumgebung geht, nur die Eieruhr...

MikeS 6. Aug 2003 07:44

Re: Alle Arbeitsgruppen, alle Rechner und dann alle freigabe
 
Moin!
werden auch Rechner mit Linux aufgelistet??

Mario 6. Aug 2003 07:51

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 02:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz