Moin Armin,
dann will ich mal "kurz" meinen Senf dazu geben

Allerdings: Auf meinem lokalen Rechner geht's, ohne Fehlermeldung, auch nicht, nur auf anderen Rechnern, wenn ich die entsprechenden Berechtigungen habe. Die Ursache dafür ist mir auch noch nicht klar.
Delphi-Quellcode:
const
NERR_Success = 0; // Success
MAX_PREFERRED_LENGTH = DWORD(-1);
type
NET_API_STATUS = DWORD;
PFILE_INFO_2 = ^FILE_INFO_2;
FILE_INFO_2 = packed record
fi2_id : DWord;
end;
PFILE_INFO_3 = ^FILE_INFO_3;
FILE_INFO_3 = packed record
fi3_id : DWord;
fi3_permissions : DWord;
fi3_num_locks : DWord;
fi3_pathname : PWChar;
fi3_username : PWChar;
end;
TcsNetFileEnum = function(
const servername : PWChar;
const basepath : PWChar;
const username : PWChar;
const level : DWord;
const bufptr : Pointer;
const prefmaxlen : DWord;
const entriesread : PDWord;
const totalentries : PDWord;
const resume_handle : PDWord
) : NET_API_STATUS; stdcall;
TcsNetApiBufferFree = function(
const Buffer : Pointer
) : NET_API_STATUS; stdcall;
implementation
var
hDLL : DWORD;
NetFileEnum : TcsNetFileEnum = nil;
NetApiBufferFree : TcsNetApiBufferFree = nil;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
pfi3Work : PFILE_INFO_3;
pfi3Save : PFILE_INFO_3;
dwEntriesRead : DWORD;
dwTotalEntries : DWORD;
dwResult : DWORD;
i : integer;
begin
if (hDLL = 0) or (@NetFileEnum = nil) or (@NetApiBufferFree = nil) then begin
MessageBox(0,'Fehler beim Laden der Funktionen','FEHLER',MB_ICONERROR);
exit;
end;
Memo1.Lines.Clear;
dwResult := NetFileEnum(nil,nil ,nil,3,@pfi3Work,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,nil);
if dwResult <> NERR_Success then begin
MessageBox(0,PChar(SysErrorMessage(dwResult)),'FEHLER',MB_ICONERROR);
exit;
end;
try
pfi3Save := pfi3Work;
for i := 1 to dwEntriesRead do begin
Memo1.Lines.Add(pfi3Save.fi3_pathname + WideString('/') + pfi3Save.fi3_username);
inc(pfi3Save);
end;
finally
NetApiBufferFree(pfi3Work);
end;
end;
initialization
begin
hDLL := LoadLibrary('NETAPI32.DLL');
if hDLL = 0 then exit;
@NetFileEnum := GetProcAddress(hDLL,'NetFileEnum');
@NetApiBufferFree := GetProcAddress(hDLL,'NetApiBufferFree');
end;
finalization
begin
if hDLL <> 0 then FreeLibrary(hDLL);
end;
Was übrigens immer besonders wichtig ist bei diesen ganzen NetXXXX Funktionen: Als Buffer muss immer die Adresse eines Pointers angegeben werden. Damit ich bei so etwas nicht die Übersicht verliere, hab' ich mir angewöhnt meine Funktionsdeklarationen für
API Aufrufe C und nicht borlandtypisch zu erstellen, also immer ohne var Parameter. Dann ist es auch leichter Beispiele zu übersetzen.
Deshalb passen Deine und meine Deklarationen nicht zusammen.