![]() |
Gruppennamen ermitteln
Hallo,
ich möchte unter NT Systemen die Namen der Standardbenutzergruppen ermitteln. Dazu verwende ich folgende Funktion:
Delphi-Quellcode:
Die Funktion
function GetGroupName(index:integer):string;
const DOMAIN_ALIAS_RID_ADMINS = $00000220; DOMAIN_ALIAS_RID_GUESTS = $00000222; DOMAIN_ALIAS_RID_USERS = $00000221; SECURITY_WORLD_RID = $00000000; SECURITY_BUILTIN_DOMAIN_RID = $00000020; var Error, rid:integer; NameSize, DomainNameSize:DWORD; sia:SID_IDENTIFIER_AUTHORITY; TargetComputer,DomainName, Name:pchar; sid:psid; sidType: SID_NAME_USE; APISuccess : boolean; begin Case index of 0 : Rid := DOMAIN_ALIAS_RID_ADMINS; 1 : Rid := DOMAIN_ALIAS_RID_GUESTS; 2 : Rid := DOMAIN_ALIAS_RID_USERS; 3 : Rid := 0; end; TargetComputer := ''; NameSize := 1024; DomainNameSize := 1024; GetMem(Name, 1024); GetMem(DomainName, 1024); If Rid = 0 then begin sia.Value[5] := 1; If AllocateAndInitializeSid(sia, 1, SECURITY_WORLD_RID, Rid, 0, 0, 0, 0, 0, 0, Sid) then begin APISuccess := LookupAccountSid(nil, Sid,Name, NameSize, DomainName, DomainNameSize, sidType); if APISuccess then begin if Assigned(sid) then FreeSid(sid) end else begin exit end; End; end else begin sia.Value[5] := 5 ; If AllocateAndInitializeSid(sia, 2, SECURITY_BUILTIN_DOMAIN_RID, Rid, 0, 0, 0, 0, 0, 0, Sid) then begin APISuccess := LookupAccountSid(nil, Sid, Name, NameSize, DomainName, DomainNameSize, sidType); if APISuccess then begin if Assigned(sid) then FreeSid(sid) end else begin exit end; End; End; result := Name; end;
Delphi-Quellcode:
gibt allerdings immer ein 'false' wieder.
LookupAccountSid(nil, Sid, Name, NameSize, DomainName, DomainNameSize, sidType);
Wo ist mein Denkfehler. Danke schonmal im voraus. Ingo |
Re: Gruppennamen ermitteln
Delphi-Quellcode:
Kleine Idee: Wie wäre es, sich den letzten Systemfehler anzeigen zu lassen und ihn auszuwerten, anstatt einfach aus der Prozedur zu springen? Dann wüßtest du auch, warum die Funktion fehl schlägt.
if APISuccess then
begin if Assigned(sid) then FreeSid(sid) end else begin exit end; Und warum so kompliziert? Warum nimmst du nicht ![]() |
Re: Gruppennamen ermitteln
Hallo Michael,
ersteinmal Danke für den Tip. Die Fehlermeldung per GetLastError() lautet:
Delphi-Quellcode:
Das Problem ist, dass der (vermeintlich) selbe Code in PureBasic bei mir ohne Probleme funktioniert.
Zuordnungen von Kontennamen und Sicherheitskennungen wurden nicht durchgeführt.
Daher ist mein Gedanke, daß sich in meinem Delphicode in den Deklarationen oder Aufrufparametern ein Fehler eingeschlichen hat. In der Datei MpuNTUser.pas habe ich auch nicht das passende gefunden. Vielleicht ist auch nicht ganz klar was ich will: Die Hauptbenutzergruppen z. Bsp. Benutzer, Jeder, Gäste usw haben je nach Systemsprache einen anderen Namen, den will ich über die Funktion herausbekommen. Ingo |
Re: Gruppennamen ermitteln
Habe die Fehler nun selbst gefunden. Hier der funktionierende Code:
Delphi-Quellcode:
function GetGroupName(index:integer):string;
const DOMAIN_ALIAS_RID_ADMINS = $00000220; DOMAIN_ALIAS_RID_GUESTS = $00000222; DOMAIN_ALIAS_RID_USERS = $00000221; SECURITY_WORLD_RID = $00000000; SECURITY_BUILTIN_DOMAIN_RID = $00000020; SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); var Error, rid:integer; NameSize, DomainNameSize:DWORD; sia:SID_IDENTIFIER_AUTHORITY; TargetComputer,DomainName, Name:pchar; sid:psid; sidType: SID_NAME_USE; APISuccess : boolean; begin Case index of 0 : Rid := DOMAIN_ALIAS_RID_ADMINS; 1 : Rid := DOMAIN_ALIAS_RID_GUESTS; 2 : Rid := DOMAIN_ALIAS_RID_USERS; 3 : Rid := 0; end; TargetComputer := ''; NameSize := 1024; DomainNameSize := 1024; GetMem(Name, 1024); GetMem(DomainName, 1024); sia := SECURITY_NT_AUTHORITY; If Rid = 0 then begin sia.Value[5] := 1; If AllocateAndInitializeSid(sia, 1, SECURITY_WORLD_RID , Rid, 0, 0, 0, 0, 0, 0, Sid) then begin APISuccess := LookupAccountSid(0, Sid,Name, NameSize, DomainName, DomainNameSize, sidType); if APISuccess then begin if Assigned(sid) then FreeSid(sid) end else begin name := ''; end; End; end else begin sia.Value[5] := 5 ; If AllocateAndInitializeSid(sia, 2, SECURITY_BUILTIN_DOMAIN_RID, Rid, 0, 0, 0, 0, 0, 0, Sid) then begin APISuccess := LookupAccountSid(0, Sid, Name, NameSize, DomainName, DomainNameSize, sidType); if APISuccess then begin if Assigned(sid) then FreeSid(sid) end else begin name := ''; end; End; End; result := Name; end; Ingo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 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