Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   NetUserGetInfo schlägt fehl mit "Überlappender E/A-Vorgang.. (https://www.delphipraxis.net/103325-netusergetinfo-schlaegt-fehl-mit-ueberlappender-e-vorgang.html)

Luckie 14. Nov 2007 11:57


NetUserGetInfo schlägt fehl mit "Überlappender E/A-Vorg
 
Ich rufe obige API-Funktion wie folgt auf:
Delphi-Quellcode:
type
  NET_API_STATUS = DWORD;

type
  TUserInfo1 = record
    usri1_name: LPWSTR;
    usri1_password: LPWSTR;
    usri1_password_age: DWORD;
    usri1_priv: DWORD;
    usri1_home_dir: LPWSTR;
    usri1_comment: LPWSTR;
    usri1_flags: DWORD;
    usri1_script_path: LPWSTR;
  end;
  PUserInfo1 = ^TUserInfo1;

const
  NERR_Success     = 0;
  USER_PRIV_ADMIN  = 2;

function NetUserGetInfo(servername: LPCWSTR; username: LPCWSTR; level: DWORD; var bufptr: PUserInfo1): NET_API_STATUS;
  stdcall; external 'netapi32.dll' name 'NetUserGetInfo';

function IsAdminByNetUserGetInfo: Boolean;
var
  CurrentUser      : string;
  ui1               : PUserInfo1;
begin
  Result := False;
  CurrentUser := GetCurrUserName;
  if NetUserGetInfo(nil, PWideChar(WideString(CurrentUser)), 1, ui1) = NERR_Success then
  begin
    Result := ui1.usri1_priv = USER_PRIV_ADMIN;
    NetApiBufferFree(ui1);
  end
  else
    Writeln(GetLastError);
end;
Als Fehlermeldung bekomme ich
Zitat:

Überlappender E/A-Vorgang wird verarbeitet.
, was ich nicht so ganz verstehe. Ich habe diese Funktion schon öfters benutzt und sehe nicht, was ich hier anders bzw. falsch mache.

Christian Seehase 14. Nov 2007 12:15

Re: NetUserGetInfo schlägt fehl mit "Überlappender E/A-
 
Moin Michael,

GetLastError sagt bei dieser Funktion aber nichts aus.
Du musst Dir schon den Rückgabewert der Funktion merken, und auf NERR_SUCCESS vergleichen, bzw. diesen Wert als Fehlercode verarbeiten.

Luckie 14. Nov 2007 12:30

Re: NetUserGetInfo schlägt fehl mit "Überlappender E/A-
 
Äh, ja. Der Magen ist leer, damit programmiert es sich nicht so gut. Der Rückgabewert ist 2221: " Der Benutzername konnte nicht gefunden werden" und das passt auch, da ich mich über einen Server authentifiziert habe. Ergebnis ist übrigens False, lokal bin ich zwar Administrator auf dem Rechner, aber eben nicht in der Domain. Hingegen wenn ich das Token prüfe, bin ich lokaler Admin. Ist schon interessant.

Dezipaitor 14. Nov 2007 12:45

Re: NetUserGetInfo schlägt fehl mit "Überlappender E/A-
 
Kurze Frage:
Was willst du mit der Funktion IsAdminByNetUserGetInfo bewirken?

Luckie 14. Nov 2007 13:39

Re: NetUserGetInfo schlägt fehl mit "Überlappender E/A-
 
Herausfinden, ob ein Benutzer Administrator ist oder nicht. Es gibt drei Möglichkeiten:
1. über NetUserGetInfo
2. über das Token
3. über die DACL
drittes implementiere ich gerade, habe aber noch ein paar Schwierigkeiten.

Christian Seehase 14. Nov 2007 13:56

Re: NetUserGetInfo schlägt fehl mit "Überlappender E/A-
 
Moin Michael,

ich vermute mal, Du meinst damit, dass Du herausfinden willst, ob der User lokaler Administrator ist.
Dann solltest Du aber nicht nur den Usernamen angeben, sondern auch, wo er User ist, also <Domäne>\<User> bzw. <Computername>\<User>
Allerdings weiss ich jetzt nicht, ob die Funktion mit solchen Angaben umgehen kann.

Luckie 14. Nov 2007 13:59

Re: NetUserGetInfo schlägt fehl mit "Überlappender E/A-
 
@Christian: Jupp, habe ich schon alles berücksichtigt. ;)

Remko 14. Nov 2007 14:20

Re: NetUserGetInfo schlägt fehl mit "Überlappender E/A-
 
AFAIK error 997 (overlapped I/O in progress) can be considered as success


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz