![]() |
NetUserGetGroups & NetUserGetLocalGroups
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:
In der Procedure Button2Click bekomme ich die folgende Fehlermeldung :
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; --------------------------- 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 ? |
Re: NetUserGetGroups & NetUserGetLocalGroups
Vergleich doch mal deinen Code mit dem aus meiner Unit MpuNTUser.pas.
|
Re: NetUserGetGroups & NetUserGetLocalGroups
Hallo Luckie,
ich habe mir Deine Unit angeschaut, nur kapiere ich es nicht ganz. Warum benutzt Du das Callback Funktion ? Ich habe das so verstanden, dass ich das direkt in eine Listbox schreiben kann ohne diese Callback Funktion ? Ich habe bei NetUserGetGroups noch einen Parameter vergessen. Den habe ich nachgetragen, nur leider zeigt er mir immer noch keine Lokalen Gruppen an. |
Re: NetUserGetGroups & NetUserGetLocalGroups
Ich habe deinen Fehler gefunden. Guck dir mal Zeile 59 an:
Delphi-Quellcode:
Du iterierst über einen leeren Speicherbereich. :mrgreen:
lgi02 := lgi02;
|
Re: NetUserGetGroups & NetUserGetLocalGroups
Zitat:
Delphi-Quellcode:
Ich bekomme jetzt immer bei NetAPIResult den Fehlercode 1722. Was ist denn jetzt noch an der Funktion falsch ? Ich verzweifel noch, ich möchte doch nur die lokalen Gruppen und die Domaingruppen auslesen.
procedure TForm7.Button2Click(Sender: TObject);
var dwEntriesRead, dwEntriesTotal: DWORD; lgi01, lgi02 : PByte; i : Integer; NetAPIResult: Cardinal; begin lgi02 := nil; lgi01 := nil; Form7.Cursor := crHourGlass; Listbox1.Clear; NetAPIResult := NetUserGetLocalGroups(PWideChar(Edit1.Text), PWideChar(Edit2.Text), 0, 0, lgi01, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal); if NetAPIResult = NERR_SUCCESS then begin lgi02 := lgi01; 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 else ListBox1.Items.Add('Fehler !! --> ' + IntToStr(NetAPIResult)); NetAPIBufferFree(lgi02); Form7.Cursor := crDefault; end; Edit: Es ist egal ob ich \\Computername oder Punkt oder \\<IP-Adresse> eingebe, ich bekomme immer den Fehler 1722. |
Re: NetUserGetGroups & NetUserGetLocalGroups
Na dann guck doch mal nach, was die bedeuten:
Code:
C:\Dokumente und Einstellungen\Michael>net helpmsg 1722
Der RPC-Server ist nicht verfügbar. C:\Dokumente und Einstellungen\Michael>net helpmsg 2221 Der Benutzername konnte nicht gefunden werden. ERLÄUTERUNG Sie haben einen unbekannten Benutzernamen angegeben. AKTION Überprüfen Sie die Schreibweise des Benutzernamens. Zur Anzeige einer Liste der Benutzer in der Sicherheitsdatenbank, geben Sie ein: NET USER |
Re: NetUserGetGroups & NetUserGetLocalGroups
Hallo Luckie,
hier ein Ausschnitt : Zitat:
Ich achte auch auf die Groß und Kleinschreibung. :!: :!: |
Re: NetUserGetGroups & NetUserGetLocalGroups
Hallo Rolf,
vergleiche mal:
Delphi-Quellcode:
Grüße vom marabu
// uses JWALM
function GetGroups(srvName, usrName: WideString; groups: TStrings): DWORD; var dwEntriesRead, dwEntriesTotal: DWORD; grpi0: Pointer; pInfo: PGroupInfo0; nErr: Integer; begin Result := NetUserGetGroups(PWideChar(srvName), PWideChar(usrName), 0, grpi0, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal); if nErr = NERR_SUCCESS then begin pInfo := grpi0; while dwEntriesRead > 0 do begin groups.Add(pInfo.grpi0_name); Inc(pInfo); Dec(dwEntriesRead); end; NetAPIBufferFree(grpi0); end; end; procedure TDemoForm.GroupsButtonClick(Sender: TObject); var nErr: DWORD; begin with GroupsBox do begin Clear; nErr := GetGroups(ServerEdit.Text, UserEdit.Text, Items); if nErr = NERR_SUCCESS then ShowMessage(Format('%d groups found', [Count])) else ShowMessage(SysErrorMessage(nErr)); end; end; |
Re: NetUserGetGroups & NetUserGetLocalGroups
Hallo zusammmen,
erstmal ein dickes Danke an marabu und Luckie. Mein letzter Delphi-Code, den ich gepostet habe war schon fast richtig.
Delphi-Quellcode:
Der Fehler liegt in Zeile 12 bei den beiden PWideChar. Ich kann anscheinend keinen String aus der Eigenschaft Text direkt als WideChar an die Funktion übergeben. Wenn ich nun die beiden Eingaben von Edit1 und Edit2 in zwei WideString-Variablen schreibe und diese dann an die Funktion übergebe, funktioniert diese wunderbar.
procedure TForm7.Button2Click(Sender: TObject);
var dwEntriesRead, dwEntriesTotal: DWORD; lgi01, lgi02 : PByte; i : Integer; NetAPIResult: Cardinal; begin lgi02 := nil; lgi01 := nil; Form7.Cursor := crHourGlass; Listbox1.Clear; NetAPIResult := NetUserGetLocalGroups(PWideChar(Edit1.Text), PWideChar(Edit2.Text), 0, 0, lgi01, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal); if NetAPIResult = NERR_SUCCESS then begin lgi02 := lgi01; 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 else ListBox1.Items.Add('Fehler !! --> ' + IntToStr(NetAPIResult)); NetAPIBufferFree(lgi02); Form7.Cursor := crDefault; end; |
Re: NetUserGetGroups & NetUserGetLocalGroups
Hallo,
Ich bin aktuell auch an dem Thema dran und habe nen Problem. Ich bekomme egal was ich einstelle nur 50 Gruppen von einem User heraus. Obwohl der User mehr wie 70 Gruppen zugeordnet hat ! Kann mir da jemand helfen oder sind 50 max. aber das kann ja eig. nicht sein ? Mein Aufruf :
Delphi-Quellcode:
Edit: Also ich habe es mal bei anderen Usern getestet.function NetUserGetGroups (Domain: LPCWSTR; UserName: LPCWSTR; Level: cardinal;var bufptr: Pointer; MaxLength:cardinal;var entriesread,totalentries:cardinal): NET_API_STATUS ;stdcall;external 'netapi32.dll'; //##################### Type TGROUPUSERSINFO_0 = record usri3_name: Array [0..100] of LPWSTR; end; PGROUPUSERSINFO_0 = ^TGROUPUSERSINFO_0; var //######### var grppointer: PGROUPUSERSINFO_0; buffer:Pointer; NetError:=NetUserGetGroups (domain,username,0, buffer,MAX_PREFERRED_LENGTH,entries,totalentries); if (NetError = NERR_SUCCESS) then begin grppointer := buffer; Listview1.items.add; Listview1.items[0].caption:=inttostr(totalentries)+'--'+inttostr(entries); For I := 0 To entries - 1 Do begin Listview1.items.Add; Listview1.items[Listview1.items.count-1].caption:=grppointer.usri3_name[i]; end; end else Bei einem wird mir 71 angezeigt obwohl er ca 90 Groups hat. Beim andere 31 obwohl er über 50 hat. Also die 50 scheint keine Grenze zusein . Zudem werden mir als Gruppen nicht angezeigt aber die sidn im selben AD Folder angelegt wo welche wo angezeigt werden. Hat dafür jemand eine Erklärung ? mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz