Köszi az eddigi válaszokat!
Azt eddig is tudtam, hogy gyakorlatilag a Windows API függvényeit fogom meghivni és már azt is látom, hogy erre több módszer is lehetséges...
Az egyik amit pernyei is említ, ami egy DLL-en kersztűl hívja meg a szükséges fügvényeket, a másik lehetőség pedig a JEDI API Header-ek (
JWA
) illetve a JEDI Windows Security Library (
JWSCL
). Igazából én a második módszerrel (a JEDI cuccossal) kívántam megoldani a problémám, de még erősen kezdeti ismerkedés fázisában vagyok (például még csak kezdem kapisgálni mi a különbség az API Headerek és a Security Library közt, illetve nem tudom nekem mindkettőt kéne-e használni?).
Az API függvények MSDN-es leírásait (amiket Gábor említett) persze magamtól is megtaláltam, például
GetNamedSecurityInfo()
, de amiket Delphi példákat találok ott a használt paramétertípusok néha különböznek az MSDN-en leírtaktól.
Jelenleg egy ilyen kezdetleges programot ollóztam össze a különböző példákból és függvényleírásokból (hibaellenőrzés még nuku, csak a függvények működésének megértését lenne hivatott szolgálni), de mondanom se kell, nem működik. A fordítás gyakorlatilag hiba nélkül lemegy, tehát szintaktikai probléma talán nincs, de egyelőre nem tudom hol a szemantikai bökő...
program ACLChecker;
uses JwaWindows;
type
_ACE_HEADER = record
AceType : BYTE;
AceFlags : BYTE;
AceSize : WORD;
end;
ACCESS_ACE = record
Header : _ACE_HEADER;
Mask : ACCESS_MASK;
SidStart : DWORD;
end;
Var
i: Longint;
Dacl: PACL;
SecDescPtr: PSECURITY_DESCRIPTOR;
aclSizeInfo: ACL_SIZE_INFORMATION;
AccLen,DomainLen,peUse: DWord;
AccName,DomainName: PChar;
Ace: ^ACCESS_ACE;
begin
SecDescPtr:=nil;
Ace:=nil;
peUse:=0;
DomainLen:=0;
AccLen:=0;
DomainName:='';
AccName:='';
GetNamedSecurityInfo(PChar('D:\\Temp'),SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,nil,nil,@Dacl,nil,SecDescPtr);
GetACLInformation(Dacl, @aclSizeInfo, SizeOf(ACL_SIZE_INFORMATION), AclSizeInformation);
if aclSizeInfo.AceCount > 0 then
begin
for i := 0 to aclSizeInfo.AceCount - 1 do
begin
GetAce(Dacl, i, Pointer(Ace));
LookupAccountSid(nil,PSID(@Ace^.SidStart),AccName,AccLen,DomainName,DomainLen,peUse);
Writeln(Domainname+'\\'+AccName);
end;
end;
LocalFree(HLOCAL(SecDescPtr));
end.
Ha valakinek van tapasztalata a JEDI cuccosokkal, vagy tudja hogy lehetne működő példaprogit varázsolni ebből, netán tud egy egyszerübb megoldást, az ne kímáljen...