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]