Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Alle PC-Namen eines Netzwerkes erhalten (https://www.delphipraxis.net/6213-alle-pc-namen-eines-netzwerkes-erhalten.html)

Illuminator-23-5 3. Jul 2003 17:34


Alle PC-Namen eines Netzwerkes erhalten
 
gibt es im delphi eine möglichkeit, eine liste mit allen ans netzwerk angeschlossene PCs zu erhalten?

Christian Seehase 3. Jul 2003 17:37

Moin Illuminator,

such' mal hier noch WNetEnumResource.
Das hatten wir schon.

Trouble_Maker 4. Jul 2003 15:55

Hiho ...

hier hab ich maln Code dafür:
Code:
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;
Code:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, ListBox1.Items);
end;

hoffe es klappt bei dir! Bei mir klappts zumindest! ^^


cu Trouble_Maker

Matze 8. Jul 2003 13:06

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hi zusammen!

Ich habe ein Pronlem...
Mein Informatiklehrer hat gemeint, dass keiner aus unserer Klasse das schaft, sich die Netzwerk-PCs unseres Internetraums in einer ListBox anzeigen zu lassen. Doch ich habe gesagt, dass ich's schaffe (blöd von mir!)
Jetzt habe ich den obigen Code verwendet, aber mein Programm listet mir nur folgendes auf: \\EASYSERVER, obwohl mind. 10 PC angeschaltet sind.

Was mache ich falsch?? :x

Gruß Matze

Christian Seehase 8. Jul 2003 16:00

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

ich hab' den Code eben mal ausprobiert, der tut's einwandfrei.

Kannst Du aus Windows heraus die anderen Rechner in der Netzwerkumgebung sehen?
Wenn für die Workstations das Browsing abgeschaltet ist, werden sie dort nämlich auch nicht angezeigt.

Matze 8. Jul 2003 16:11

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hi!

Wenn ich an die Benutzer per Net Send Befehle schicke, dann geht das, falls du das meinst.

Gruß Matze

Christian Seehase 8. Jul 2003 16:28

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

nein, das meine ich nicht.
Das die Rechner mit ihren Namen erreichbar sind, hat nichts damit zu tun, ob man sie in der Netzwerkumgebung sehen kann oder nicht.
Das ist so ähnlich wie mit den versteckten Freigaben. Sie sind da, man kann sie sich verbinden, bzw. darauf zugreifen, aber im Explorer sehen kann man sie nicht.

Wenn Du in den Explorer gehst, Netzwerkumgebung, und da mal schaust
(Netzwerkumgebung, dann in Microsoft Windows-Netzwerk), müssten die Domänen/Arbeitsgruppen zu sehen sein, soweit verfügbar, und darin wieder die einzelnen Rechner.

Deshalb meine Frage: Sind die Rechner da zu sehen?

Wenn nicht, hat sich euer Lehrer nämlich eine "kleine Gemeinheit" einfallen lassen ;-)

Matze 8. Jul 2003 16:31

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Ich bin grad nicht in der Schule, aber ich glaube in der Netzwerkumgebung sind die Rechner nicht aufgeführt. Heißt das, mein Lehrer hatte Recht, als er sagte, das könne niemand von uns proggen?

Christian Seehase 8. Jul 2003 16:34

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

wenn sie da nicht zu sehen sind, melden sie sich nicht beim Browserdienst (hat nichts mit dem Webbrowser zu tun).
Dann dürfte es mit den WNetxxx Funktionen nicht machbar sein.

Aber es gibt auch noch andere ;-)

Auf welchem Betriebbsystem soll das Programm laufen?

Chewie 8. Jul 2003 16:35

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Na ja, es gäbe immernoch die BruteForce-Methode. Also alle erdenklichen Namen bilden und einen Verbindungsversuch starten. Könnte allerdings ein paar Tage dauern :mrgreen:

Matze 8. Jul 2003 16:36

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hi!
Auf Windows 2000 Prof, wäre gut, wenn's auch unter XP laufen würde, aber das müsste es dann ja eigentlich.
Gruß Matze

Christian Seehase 8. Jul 2003 16:37

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Chewie,

da würde ich lieber die IP-Adress Ranges durchpingen, und dann im Stile von Ping -a die zugehörigen Namen ermitteln.
Wäre auch Brute Force, aber etwas gezielter ;-)

Matze 8. Jul 2003 16:38

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Wenn das nicht Tage dauert, sondern nur wenige Minuten, dann wäre ich euch dankbar, wenn ich den Code für mich ändern könntet.

Christian Seehase 8. Jul 2003 16:39

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

dann ist es ja gut.
Entscheidend war für mich jetzt, dass es auf der NT Schiene (NT 4.0/W2K/XP...) läuft.

Ich versuch' mal was zusammenzubasteln.

Matze 8. Jul 2003 16:41

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Das wär echt genial, danke.
Heute schaffst du das nicht mehr, oder?
Ich weiß, ich hab's euch recht spät gesagt, aber morgen habe ich wieder Informatik. (*zitter*)

Christian Seehase 8. Jul 2003 17:17

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

die Deklarationen:
Delphi-Quellcode:
// mit xxx.H sind die Header Dateien von Microsoft gemeint,
// in denen die jeweiligen Dinge deklariert wurden
const
// aus LMCONS.H
  MAX_PREFERRED_LENGTH = DWORD(-1); // Alles was da ist raussuchen

// aus LMERR.H
  NERR_Success = 0; // Funktion erfolgreich ausgeführt

// aus LMSERVER.H
  SV_TYPE_ALL = $FFFFFFFF; // Alle Rechner (Server, Workstations)

type
// LMCONS.h
  NET_API_STATUS = DWORD;

// aus LMSERVER.H
// Datenstruktur für die zu ermittelnden Werte
PSERVER_INFO_100 = ^SERVER_INFO_100;
SERVER_INFO_100 = packed record
  sv100_platform_id : DWORD;
  sv100_name       : PWideChar;
end;

// aus LMSERVER.h
// Funktion die alle (bei prefmaxlen = MAX_PREFERRED_LENGTH) Rechner des Typs
// servertype zurückliefert
function NetServerEnum(
  const servername   : PWideChar;
  const level        : DWORD;
  const bufptr       : Pointer;
  const prefmaxlen   : DWORD;
  const entriesread  : PDWORD;
  const totalentries : PDWORD;
  const servertype   : DWORD;
  const domain       : PWideChar;
  const resume_handle : PDWORD
) : NET_API_STATUS; stdcall; external 'netapi32.dll';

// aus LMAPIBUF.h
// Da die Netxxx Funktionen unter NTff den Buffer selber reservieren
// muss dieser mit dieser Funktion freigegeben werden
function NetApiBufferFree(
  const Buffer : Pointer
) : NET_API_STATUS; stdcall; external 'netapi32.dll';
Der Aufruf:

Delphi-Quellcode:
procedure TfrmMAIN.Button1Click(Sender: TObject);

var
  pBuffer       : PSERVER_INFO_100; // Pointer auf die zu ermittelnden Daten
  // da für die Freigabe des Buffers der Wert des Originalpointers erhalten
  // bleiben muss, dient diese Variable zum Abarbeiten des Buffers
  pWork         : PSERVER_INFO_100;
  dwEntriesRead : DWORD;
  dwTotalEntries : DWORD;
  i             : integer;
  dwResult      : NET_API_STATUS;

begin
  ListBox1.Items.Clear;
  // 1. Paramter muss nil sein
  // 2. Parameter = Daten des Typs 100 abrufen
  // 3. Parameter = Adresse (!!!) einer Variablen, die den Pointer auf den Buffer erhält
  // 4. Parameter = alle Rechner die dem Typ in Parameter 6 entsprechen auflisten
  // 5. Parameter = So viele Einträge wurden ausgelesen
  // 6. Parameter = So viele Einträge gäbe es
  //                (muss gleich 4. sein, wenn MAX_PREFERRED_LENGTH angegeben wurde)
  // 7. Parameter = Alle Rechner
  // 8. Parameter = nil > In der primären Domäne (Arbeitsgruppe) suchen.
  //                ggf. kann hier auch eine Domäne angegeben werden.
  // 9. Parameter muss 0 sein
  dwResult := NetServerEnum(nil,100,@pBuffer,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,SV_TYPE_ALL,nil,0);
  if dwResult = NERR_SUCCESS then begin
    try
      pWork := pBuffer;
      for i := 1 to dwEntriesRead do begin
        // Die Namen der gefundenen Rechner in die ListBox schreiben
        ListBox1.Items.Add(pWork.sv100_name);
        // Da pWork typisiert ist, wird intern automatisch im die Länge der
        // der Struktur erhöht, deshalb reicht ein einfacher inc
        inc(pWork);
      end;
    finally
      NetApiBufferFree(pBuffer);
    end;
  end else begin
    MessageBox(self.Handle,PChar('NetServerEnum Fehler: '+IntToStr(dwResult)+#13#10#13#10+SysErrorMessage(dwResult)),'Fehler',MB_ICONERROR);
  end;
end;
Wichtig:
Das funktioniert nicht unter 9x/ME, da hier die Funktionen anders aufgebaut sind, und sich in einer anderen DLL befinden.
Da ich die Funktionen hier statisch eingebunden habe, würde das Programm unter 9x/ME nicht einmal starten.

Ob man auf diesem Wege die ansonsten unsichtbaren Rechner erwischt weiss ich leider auch nicht. Mit den sichtbaren klappt's auf jeden Fall.

[EDIT]
Das sollte übrigens unabhängig von den Userrechten funktionieren.
[/EDIT]

Matze 8. Jul 2003 17:19

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hey! Vielen Dank! :mrgreen: :mrgreen:
Da hast du dir aber viel Mühe gemacht, alle Achtung. Ich binde das jetzt in mein Prog ein und poste morgen, ob's geklappt hat.
Gruß Matze

Christian Seehase 8. Jul 2003 17:24

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

bitte gerne.
[EDIT]
Ich bin auch mal zur Schule gegangen ;-)
Leider gab's Informatik da noch nicht als Fach.
[/EDIT]

Allzuviel Mühe war's auch nicht, da ich die ganzen Deklarationen schon vor längerer Zeit mal übersetzt hatte.

Das aufwendigste waren die Kommentare ;-)

Was ich eben noch vergessen hatte:
Es gibt die Deklartionen u.a. auch fertig von den JEDIs, aber da diese die Funktionen Delphi-Like importieren (also mit var Parametern) würden die sich mit meinen nicht vertragen.

Matze 8. Jul 2003 17:57

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hallo Chris!
Also, nochmals danke!
Informatik ist bei uns auch freiwillig und nehme es jetzt auch in Klasse 12. Aber auch nur, weil programmieren mit Delphi wirklich Spaß macht. (im Gegensatz zu QBasic, was ich davor hatte :mrgreen: ).
Gruß Matze

Christian Seehase 8. Jul 2003 18:35

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

ich jetzt mal auf das Ergebnis gespannt.
Schau doch bitte auch auf jeden Fall mal nach, ob die Rechner wirklich nicht in der Netzwerkumgebung auftauchen (durften sie eigentlich nicht).

Matze 9. Jul 2003 09:15

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hi Chris!

Wenn ich in der Netzwerkumgebung auf gesamtes Netzwerk klicke, dann seh ich gar nichts. So ein Mist!
Heißt das, dass ich das nicht programmieren kann?
Falls du weißt, wie so etwas geht, dann hilf mir bitte dabei.

Gruß Matze

Matze 10. Jul 2003 09:25

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hi Chris, bitte hilf mir (oder auch jemand anderes). :chat: :chat:

Christian Seehase 10. Jul 2003 12:11

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

das heisst also, dass NetServerEnum auch nicht funktioniert hat?

Matze 10. Jul 2003 14:54

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hi!
Das stimmt, ja! Naja im Notfall gebe ich meinem Lehrer Recht...
Gruß Matze

Christian Seehase 10. Jul 2003 15:04

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

schade :?
Schön wär's gewesen...

Eine Idee, die hier schon angeklungen ist hab' ich allerdings noch.

Wann hast Du denn wieder Info, und könntest es probieren?

Matze 10. Jul 2003 15:20

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Vor den Sommerferien habe ich nur noch morgen die Möglichkeit, im Notfall mach's ich halt dann erst im September.

Christian Seehase 10. Jul 2003 15:23

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

ich versuch' dann gleich mal die Idee umzusetzen. Wenn's länger wird häng ich das als Attachement dran ;-)

Matze 11. Jul 2003 13:47

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Servus!
Das ist nett von dir, danke! :mrgreen:
Gruß Matze

Gast 13. Jul 2003 10:12

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Zieh dir mal IPEye von http://www.ntsecurity.nu und starte es. Checke mal die Ports der umliegenden Rechner. Wenn 137 zu ist, kannste nix machen.

Es ist aber sehr wohl möglich an einzelne Rechner zu verbinden (quasi durch probieren) und dann den Rechnernamen zu ermitteln. Das ist sowas wie ein Share ...

Ich kann aber sowas frühestens nach Donnerstag bieten.

Nachtrag: An Port 137 ist der NetBIOS-Name Service. Wenn der zu ist, werden Broadcasts mit Namenanfragen (sowas wird geschickt wenn du in der Netzwerkumgebung Refresh machst) beantwortet ... so kommen die Namen in die Netzwerkumgebung.

PS: Als ich auf der ersten Seite gelesen habe, hab ich auch sofort an NetServerEnum gedacht. Sag doch mal, was die anderen Rechner für Systeme oben haben!

Matze 15. Jul 2003 20:01

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Hallo!
Alle anderen Rechner sind die selben.
Alle haben Windows 2000 Prof.
Gruß Matze

Gast 15. Jul 2003 20:16

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Und die Ports?

Matze 18. Jul 2003 09:28

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Sorry! Das weiß ich nicht.

Gast 18. Jul 2003 11:28

Re: Alle PC-Namen eines Netzwerkes erhalten
 
LOL ... und du kannst es natürlich auch nicht rausbekommen?

Das wäre das Mindeste um dir eine Prognose zu bieten, ob du überhaupt eine Chance hast.

Matze 18. Jul 2003 13:21

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Servus!
Ich weiß erstens nicht, wie man das rausbekommt und zweitens habe ich erst wieder Anfang September Schule.
Gruß Matze

Matze 2. Sep 2003 15:52

Re: Alle PC-Namen eines Netzwerkes erhalten
 
*nachobenschieb*

Geht das nicht ohne die Ports zu wissen und angenommen Port 137 ist zu, geht's dann gar nicht?? :gruebel:

Matze 6. Sep 2003 13:58

Re: Alle PC-Namen eines Netzwerkes erhalten
 
@Christian Seehase:
Du kennst dich doch auf diesem Gebiet so gut aus, geht das dann gar nicht? :gruebel:

Christian Seehase 6. Sep 2003 14:38

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

ich denk' noch mal drüber nach, auf welchem Wege das eventuell getrickst werden kann.
Welche Berechtigungen bestehen denn für den Account mit dem das Programm laufen soll im Netzwerk?

Matze 6. Sep 2003 14:40

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Ich bin halt kein Admin, sondern ein ganz normaler User mit eingeschränkten Rechten. Falls du das gemeint hast. :?

Christian Seehase 6. Sep 2003 14:45

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Moin Matze,

ja, das meinte ich. Je mehr Rechte, umso leichter kann's werden. ;-)

Was auch immer mir vielleicht einfallen sollte:
Ich werd's nicht unbedingt testen können...

Matze 6. Sep 2003 14:46

Re: Alle PC-Namen eines Netzwerkes erhalten
 
Ich bin offen für jeden Vorschlag, testen kann ich sie ja. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.
Seite 1 von 2  1 2      

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