Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Alle PC-Namen eines Netzwerkes erhalten

  Alt 8. Jul 2003, 17:17
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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat