Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Alle User eines Rechners auflisten (https://www.delphipraxis.net/2336-alle-user-eines-rechners-auflisten.html)

Luckie 19. Jan 2003 12:18

Ich vermute mal durch #0 und abgeschlossen wird die Liste mit #0#0.

CalganX 19. Jan 2003 12:23

Würde ich ausprobieren, nur gibt obiges folgendes aus (Label1.Caption := aBuffer);
Zitat:

|í|
Chris

CalganX 19. Jan 2003 13:23

So, nachdem ich mir mal die Ausgabestruktur angesehen habe (_USER_INFO_0). Kommt nun raus (Label1.Caption := Buffer.usri0_name):
Zitat:

?|?|?|?|?|???????????????????????????????????[...]???SUPPORT_388945a0
Chris

Christian Seehase 19. Jan 2003 13:50

Moin Chris,

kleine Gemeinheit der Netxxx Funktionen.
Da die Funktionen den erforderlichen Platz für die Daten selber reservieren, wird als Buffer kein Pointer, sondern die Adresse eines Pointers übergeben.

Der Aufruf muss also

Delphi-Quellcode:
if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, [color=red]@[/color]aBuffer, MAX_LENGTH, iUsers, iUsers{2}, nil) = NERR_SUCCESS then
lauten.

Ganz wichtig:
Nachdem der Buffer abgearbeitet wurde muss er mit NetApiBufferFree wieder freigegeben werden.

Um den Buffer abzuarbeiten empfiehlt es sich eine zweite Variable des Typs anzulegen, und diesem dann den Wert in aBuffer nach Aufruf der Funktion zu übergeben.
Wenn man als Parameter prefmaxlen den Wert MAX_PREFERRED_LENGTH angibt erhält man ja alle Einträge, und kann diese dann in einer for Schleife abarbeiten, wobei ein inc(aBuffer) genügt, um auf den nächsten Eintrag zu kommen (wenn man aBuffer vom richtigen Typ her angelegt hat!)

Da ich den Zahlenwert der Konstanten MAX_LENGTH nicht kenne:
Tausch die lieber mal gegen MAX_PREFERRED_LENGTH aus.

CalganX 19. Jan 2003 14:00

Hi,
also, ich habe nun 2 Buffer vom Typ _USER_INFO_0 (so steht es auch im PSDK). Nun habe ich folgenden Source:
Delphi-Quellcode:
procedure TMainFrm.FormCreate(Sender: TObject);
var
  aBuffer1, aBuffer2: _USER_INFO_0;
  iUsers: Cardinal;
begin
  if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, @aBuffer1,{<-} MAX_PATH+1,
    iUsers, iUsers{2}, nil) = NERR_SUCCESS then begin
     aBuffer2 := aBuffer1;
     NetApiBufferFree(@aBuffer1);
     Label1.Caption := aBuffer2.usri0_name;
  end;
end;
Allerdings gibt es an der Stelle, wo der Pfeil ist folgenden Fehler:
Zitat:

Zitat von Delphi-Debugger
[Error] Unit1.pas(31): Types of actual and formal var parameters must be identical

Hast du da eine Idee, Chris?

Chris

Luckie 19. Jan 2003 14:01

Zitat:

Zitat von Christian Seehase
Um den Buffer abzuarbeiten empfiehlt es sich eine zweite Variable des Typs anzulegen, und diesem dann den Wert in aBuffer nach Aufruf der Funktion zu übergeben.
Wenn man als Parameter prefmaxlen den Wert MAX_PREFERRED_LENGTH angibt erhält man ja alle Einträge, und kann diese dann in einer for Schleife abarbeiten, wobei ein inc(aBuffer) genügt, um auf den nächsten Eintrag zu kommen (wenn man aBuffer vom richtigen Typ her angelegt hat!)

Öhm, ja jetzt muß ich direkt mal nach Source fragen, weil ich nicht so ganz verstehe was du meinst.
Wenn aBuffer vom Typ Pointer ist kann ich ja mit Inc(aBuffer) an den nächsten Eintrag ran. Aber wie bekomme ich jetzt das ganze im Klartext?

CalganX 19. Jan 2003 14:06

Wenn du den Typ _USER_INFO_0 meinst, dann ist das ganze ein record. Du kannst darauf zugreifen. Wie, steht in irgendeinem der vorangegangenen Sources.

Chris

Luckie 19. Jan 2003 14:12

Dass das Ding ein Record ist, ist klar. Den kenne ich ja auch. Nur ist es ja nicht ein Record, sondern jeder User hat ja einen Record. Irgendwie so stelle ich mir das vor:
Delphi-Quellcode:
s := aBuffer[0].UserName; // 1. gefundene User
s := aBuffer[1].Username; // 2. gefundene User

Christian Seehase 19. Jan 2003 19:39

Moin Zusammen,

also ich gehe da von der PSDK Deklaration aus, so dass der Typ von aBuffer ein Pointer auf eine USER_INFO_x Struktur ist.
Wie in Delphi sonst üblich einen Record zu übergeben kann ja eigentlich deshalb schon nicht klappen, da man sich ja eine beliebige Anzahl an Einträgen zurückgeben lassen kann, ohne vorher zu Wissen, wieviele es sind.

Ein Witz an diesen Netxxx Funktionen ist ja, dass sie den erforderlichen Speicher selber reservieren.

aBuffer wäre dann also als

Delphi-Quellcode:
var
  aBuffer : PUSER_INFO_1;
deklariert, so dass man auf diesem Wege das Ergebnis verarbeiten kann

Delphi-Quellcode:
for i := 1 to dwEntriesRead do
begin
  //... was auch immer mit aBuffer geschehen soll
  inc(aBuffer); // auf den nächsten Eintrag adressieren
end;
Deshalb auch das Sichern von aBuffer in einer Variablen gleichen Typs, da man ja an NetApiBufferFree die Startadresse des Ergebnisbuffers zurückliefern muss, damit der Speicher wieder freigegeben werden kann.

Als Pointer ist aBuffer in der Funktion nur deshalb deklariert, da es sich um einen Pointer auf verschiedene Datenstrukturen (USER_INF0_x) handeln kann, so dass eine feste Typangabe nicht möglich ist.

CalganX 20. Jan 2003 12:33

Hi Christian,
ich hatte mir heute auch mal was ausgedacht, werde das nachher mal prüfen, aber nun zu deinem Source:
woher kommt dwReadEntries?

Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
Seite 2 von 4     12 34      

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