In Windows NT4/2000/XP kunnen aan bestanden specifieke bestandsmachtigingen aan gebruikers worden toegekend, zoals in onderstaand plaatje:
Om de machtigingen van de huidige gebruiker te achterhalen probeer ik GetEffectiveRightsFromAcl te gebruiken. Deze functie wordt veelvuldig op internet genoemd, maar iedereen verwijst naar een paar onbruikbare voorbeelden zonder zelf wat te laten zien hoe je die functie moet gebruiken. Dit is mijn aanzet tot nu toe:

Tot en met regel 29 32 gaat alles goed. Ik heb gecontroleerd of de verkregen security descriptor (pSD) en DACL geldig zijn en dat blijkt inderdaad het geval. Op regel 36 gaat het echter mis: ik krijg een access violation in module NTMARTA.DLL, terwijl GetEffectiveRightsFromAcl door ADVAPI32.DLL wordt geëxporteerd. Vaag.
Hoe krijg ik mijn code werkend?
Om de machtigingen van de huidige gebruiker te achterhalen probeer ik GetEffectiveRightsFromAcl te gebruiken. Deze functie wordt veelvuldig op internet genoemd, maar iedereen verwijst naar een paar onbruikbare voorbeelden zonder zelf wat te laten zien hoe je die functie moet gebruiken. Dit is mijn aanzet tot nu toe:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| function GetFileAccessRights(const FileName: string): ACCESS_MASK; var pSD: PSECURITY_DESCRIPTOR; LengthNeeded, LengthAlloc, Err: Cardinal; DACLPresent, DACLDefaulted: LongBool; DACL: PACL; ATrustee: TRUSTEE; AccessRights: ACCESS_MASK; begin { Retrieve number of bytes necessary to store the security descriptor. This should cause an ERROR_INSUFFICIENT_BUFFER error. } pSD := nil; GetFileSecurity(PChar(FileName), DACL_SECURITY_INFORMATION, pSD, 0, LengthNeeded); Err := GetLastError; if Err <> ERROR_INSUFFICIENT_BUFFER then begin SetLastError(Err); // Restore the now removed error RaiseLastOSError; end; { Allocate memory for security descriptor } GetMem(pSD, LengthNeeded); try { Retrieve security descriptor } LengthAlloc := 0; if not GetFileSecurity(PChar(FileName), DACL_SECURITY_INFORMATION, pSD, LengthNeeded, LengthAlloc) then RaiseLastOSError; { Get discretionary access control list (DACL) } if not GetSecurityDescriptorDacl(pSD, DACLPresent, DACL, DACLDefaulted) then RaiseLastOSError; BuildTrusteeWithName(@ATrustee, 'Administrator'); // Hard gecodeerd voor deze test if GetEffectiveRightsFromAcl(DACL^, ATrustee, AccessRights) <> ERROR_SUCCESS then RaiseLastOSError; Result := AccessRights; finally FreeMem(pSD); end; end; |
Tot en met regel 29 32 gaat alles goed. Ik heb gecontroleerd of de verkregen security descriptor (pSD) en DACL geldig zijn en dat blijkt inderdaad het geval. Op regel 36 gaat het echter mis: ik krijg een access violation in module NTMARTA.DLL, terwijl GetEffectiveRightsFromAcl door ADVAPI32.DLL wordt geëxporteerd. Vaag.
Hoe krijg ik mijn code werkend?
Een goede grap mag vrienden kosten.
