Entwickler-Ecke

Free Pascal - Merkwürdigkeiten mit Windows ACL-Funktionen


Christian213 - Mo 07.07.14 16:29
Titel: Merkwürdigkeiten mit Windows ACL-Funktionen
Hallo,

ich versuche mir mittels GetNamedSecurityInfo() die ACL eines Ordner auszulesen.
Der Funktionsaufruf im Code sieht folgendermaßen aus:

Delphi-Quelltext
1:
  dwError := GetNamedSecurityInfo(pAnsiChar(Filename), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nilnil, @ExistingDacl, nil, @psd);                    

Leider meckert der Compiler:
D:\workspace\Libs\MyFileUtils.pas(54,70) Error: Incompatible type for arg no. 2: Got "SE_OBJECT_TYPE", expected "_SE_OBJECT_TYPE"

Ändere ich nun auf _SE_FILE_OBJECT, so kommt folgende Meldung:
D:\workspace\Libs\MyFileUtils.pas(54,71) Error: Identifier not found "_SE_FILE_OBJECT"

In der Unti JwaAclApi ist die Funktion so definiert:

Delphi-Quelltext
1:
2:
3:
function GetNamedSecurityInfo(pObjectName: LPTSTR; ObjectType: SE_OBJECT_TYPE;
  SecurityInfo: SECURITY_INFORMATION; ppsidOwner, ppsidGroup: PPSID; ppDacl,
  ppSacl: PPACL; var ppSecurityDescriptor: PSECURITY_DESCRIPTOR): DWORD; stdcall;


Demnach müsste SE_FILE_OBJECT eigentlich passen?!?

Weiß jemand Rat?
Danke!


Christian213 - Di 08.07.14 12:30

Ich habe mittlerweile eine Lösung gefunden. Für alle, die vlt. auch noch auf das Problem stoßen sollten:

In Lazarus gibt es die verwendeten Typdefinitionen leider mehrfach. Sobald man die "Windows"-Unit mit einbindet, nimmt der Compiler leider die falschen.
Daher lassen sich die Funktionsaufrufe aus JwaAclApi dann nicht kompilieren (und würden selbst bei einem erfolgreichen Kompilat sicher nicht richtig laufen).
Lösung ist, dass man alle Verweise auf die "JwaWindows"-Unit legt. Dies gilt sowohl für die Funktionsaufrufe, als auch für definierte Variablen oder übergebene Parameter.
In meinem Fall sieht das nun so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  (...)
  dwError : dWord;
  ExistingDacl : JwaWindows.PPACL;
  psd : JwaWindows.PSECURITY_DESCRIPTOR;
  (...)
begin
  (...)
  psd := nil;
  dwError := JwaWindows.GetNamedSecurityInfo(pAnsiChar(Filename), JwaWindows.SE_FILE_OBJECT, JwaWindows.DACL_SECURITY_INFORMATION, nilnil, ExistingDacl, nil, psd);

Vielleicht hilft das ja noch jemand anderem.

VG
Christian