Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Válasz: ACL API 2013 máj. 02 21:35 #1247

  • ilyr
  • ilyr profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 7
  • Köszönetek: 0
Na mivel se itt, se az angol fórumon nem kaptam megoldást a problémámra, tovább kisérleteztem és sikerült elérni azt amit szerettem volna, ezért ezt megosztom itt, hátha valakinek szüksége lesz még ilyesmire. Ez a kis példaprogram az E:\\Temp könyvtáron lévő hozzáférések nevét írja ki:

[code]program ACLChecker;

uses
JwaAccCtrl,
JwaWinBase,
JwaWinType,
JwaWinNT,
JwaWinError,
JwaAclAPI;

type
_ACE_HEADER = record
AceType: byte;
AceFlags: byte;
AceSize: word;
end;

ACCESS_ACE = record
Header: _ACE_HEADER;
Mask: ACCESS_MASK;
SidStart: DWORD;
end;

var
Dacl: PACL;
SecDescPtr: PSECURITY_DESCRIPTOR;
aclSizeInfo: ACL_SIZE_INFORMATION;
AccLen, DomainLen, peUse, i: DWORD;
AccName, DomainName: Array of Char;
Ace: ^ACCESS_ACE;

begin
SecDescPtr := nil;
Dacl := nil;
Ace := nil;
peUse := 0;
DomainLen := 0;
AccLen := 0;
DomainName := '';
AccName := '';
GetNamedSecurityInfo(LPTSTR('E:\\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, Ace);
If (Not LookupAccountSid(nil, PSID(@Ace^.SidStart), @AccName[0], AccLen,
@DomainName[0], DomainLen, peUse) and (GetLastError = ERROR_INSUFFICIENT_BUFFER)) Then
Begin
SetLength(DomainName,DomainLen);
Setlength(AccName,AccLen);
if LookupAccountSid(nil, PSID(@Ace^.SidStart), @AccName[0], AccLen, @DomainName[0], DomainLen, peUse) Then
Begin
Writeln(PChar(DomainName),'\\',PChar(AccName));
end;
end;
end;
end;
LocalFree(HLOCAL(SecDescPtr));
end.[/code

Válasz: ACL API 2013 febr. 19 20:19 #1225

  • ilyr
  • ilyr profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 7
  • Köszönetek: 0
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... :)

Válasz: ACL API 2013 febr. 19 19:55 #1224

  • pernyei
  • pernyei profilkép
  • Haladó forumozó
  • Haladó forumozó
  • In Lazarus We Trust
  • Hozzászólások: 54
  • Köszönetek: 1
Talán segít ez a két példa, amivel az egyik programomban hívok meg funkciókat Windows DLL-ből. Delphi és Lazarus alatt is működtek, bár csak kísérleti jelleggel írtam meg ezeket.

function MessBox(HWnd: Integer; Text, Caption: PChar; Flags: Integer): Integer; stdcall; external 'user32.dll' name 'MessageBoxA';

function LockWindowUpdate(HWnd: Integer): Boolean; stdcall; external 'user32.dll' name 'LockWindowUpdate';

A megfelelő paraméterezést, ha jól emlékszem, a Windows API help-jében találtam meg. Sajnos, arra már nem emlékszem, hol találtam magát a helpet: :S

Válasz: ACL API 2013 febr. 19 13:16 #1223

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Az egyes operációs rendszerek belső eljárásainak használata nem a programozási nyelv vagy környezet függvénye.

Az általad említett eljárások részleteit (paraméterekkel) megtalálhatod az msdn honlapján vagy egy internetes kereső -vel is: msdn.microsoft.com/en-us/library/windows/desktop/aa375742%28v=vs.85%29.aspx

Az Delphi és a Lazarus alapvető adattípusai általában azonosak és ugyanúgy használhatók. Az egyes unit-okban előforduló érdekes nevű típusok többnyire a függvénytárak/unit-ok fejlesztői által kitalált "álnevek".
msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx

Lásd még:
wiki.freepascal.org/Variables_and_Data_Types
wiki.freepascal.org/Lazarus_For_Delphi_Users
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

ACL API 2013 febr. 18 18:51 #1221

  • ilyr
  • ilyr profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 7
  • Köszönetek: 0
Sziasztok!

Van valakinek tapasztalata a Windows API-ból az ACL-ek használatával? Egy sima NTFS folder DACL-jét szeretném megjeleníteni, de az istennek se sikrül összehozni... Eddig kb. annyira jutottam, hogy ha minden igaz, a JWAWindows unit használata mellett az alábbi fügvényeket/eljárásokat kéne használnom:

- GetNamedSecurityInfo
- GetACLInformation
- GetAce
- LookupAccountSid

Elég sokat keresgéltem doksikat/példákat hozzájuk, de többnyire Python/Delphi/C források vannak és ugyan a Delphi elvileg közel áll a Lazarus-hoz, úgy fest, hogy ezeknek az eljárásoknak a paraméterei kicsit más típúsuak ott...

Kb. egy hete hallottam először a Lazarus-ról, most próbálgatom vele feleleveníteni a Pascal-os/Delphi-s múltamat és ezeddig nagyon tetszik, de jó lenne ha lenne hova fordulni az esetleges kérdésekkel.

Az esetleges ötleteket/segítséget előre is köszönöm!

Üdv,

ilyr

  • Oldal:
  • 1