Einzelnen Beitrag anzeigen

Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

NetUserGetGroups & NetUserGetLocalGroups

  Alt 27. Sep 2007, 23:18
Hallo zusammen,

ich versuche mich gerade daran, die Gruppenmitgliedschaften von einem User lokal und in der Domain auszulesen. Nur leider komme ich irgendwie nicht weiter.
Hier mal der Code :
Delphi-Quellcode:
type
  GROUP_USERS_INFO_0 = record
    grui0_name : LPWSTR;
  end;
  PGROUP_USERS_INFO_0 = ^GROUP_USERS_INFO_0;

  LOCALGROUP_USERS_INFO_0 = record
    lgrui0_name : LPWSTR;
  end;
  PLOCALGROUP_USERS_INFO_0 = ^LOCALGROUP_USERS_INFO_0;

const
  MAX_PREFERRED_LENGTH = DWORD(-1);
  NERR_Success = 0;

function NetUserGetGroups(ServerName : LPWSTR; UserName : LPWSTR; Level : DWORD;
         var Buf : PByte; PrefMaxLen : DWORD; var EntriesRead : DWORD;
         var TotalEntries : DWORD ) : DWORD; stdcall; external 'netapi32.dll';
function NetUserGetLocalGroups(ServerName : LPWSTR; UserName : LPWSTR; Level : DWORD;
         var Buf : PByte; PrefMaxLen : DWORD; var EntriesRead : DWORD;
         var TotalEntries : DWORD ) : DWORD; stdcall; external 'netapi32.dll';
function NetApiBufferFree( Buffer : Pointer ) : DWORD; stdcall; external 'netapi32.dll';

procedure TForm7.Button1Click(Sender: TObject);
var
  dwEntriesRead, dwEntriesTotal: DWORD;
  lgi01, lgi02 : PByte;
  i : Integer;
begin
  lgi02 := nil;
  Form7.Cursor := crHourGlass;
  Listbox1.Clear;
  if NetUserGetGroups(PWideChar(Edit1.Text), PWideChar(Edit2.Text), 0, lgi01, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal) = NERR_SUCCESS then
  begin
    lgi02 := lgi02;
    for i := 0 to dwEntriesRead - 1 do
    begin
      Listbox1.Items.Add(PGROUP_USERS_INFO_0(lgi01)^.grui0_name);
      Inc(Integer(lgi01), SizeOf(Pointer));
    end;
  end;
  NetAPIBufferFree(lgi02);
  Form7.Cursor := crDefault;
end;

procedure TForm7.Button2Click(Sender: TObject);
var
  dwEntriesRead, dwEntriesTotal: DWORD;
  lgi01, lgi02 : PByte;
  i : Integer;
begin
  lgi02 := nil;
  Form7.Cursor := crHourGlass;
  Listbox1.Clear;
  if NetUserGetLocalGroups(PWideChar(Edit1.Text), PWideChar(Edit2.Text), 0, lgi01, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal) = NERR_SUCCESS then
  begin
    lgi02 := lgi02;
    for i := 0 to dwEntriesRead - 1 do
    begin
      Listbox1.Items.Add(PLOCALGROUP_USERS_INFO_0(lgi01)^.lgrui0_name);
      Inc(Integer(lgi01), SizeOf(Pointer));
    end;
  end;
  NetAPIBufferFree(lgi02);
  Form7.Cursor := crDefault;
end;
In der Procedure Button2Click bekomme ich die folgende Fehlermeldung :

---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt .\build\Project8.exe trat ein Problem mit folgender Meldung auf: 'access violation at 0x597e615c: read of address 0xffffffff'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------

Beim Debuggen ist mir aufgefallen, dass diese Fehlermeldung erst in der Zeile 56 kommt. Warum ist das so ? Was habe ich falsch gemacht ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat