Autor Beitrag
Christian213
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66
Erhaltene Danke: 3

Win XP, Win 7 64Bit
Lazarus 1.0.10
BeitragVerfasst: Mo 07.07.14 15:29 
Hallo,

ich versuche mir mittels GetNamedSecurityInfo() die ACL eines Ordner auszulesen.
Der Funktionsaufruf im Code sieht folgendermaßen aus:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66
Erhaltene Danke: 3

Win XP, Win 7 64Bit
Lazarus 1.0.10
BeitragVerfasst: Di 08.07.14 11: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:
ausblenden 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