Doel Programma:
Ik heb de onderstaande functies gebruikt om de rechten van een bestand voor een specifieke user op te vragen.
Probleem:
Nu is het probleem dat er wat geheugen problemen zijn. De symptonen zijn keer op keer echter anders. Maar het probleem duikt telkens op wanneer de aanroep naar functie BuildTrusteeWithSid is gedaan.
Symptonen:
Na de aanroep is het de ene keer zo dat de zojuist op gevraagde acl structure verandert de andere keer is het zo dat er een memory exception optreedt. Deze symptonen wisselen elkaar af ook zonder dat de code opnieuw gecompileerd wordt.
Verdere info:
Ik heb al enkele dagen gezocht naar een bug, zo heb ik mijn programma vergeleken met verschillende C voorbeelden (mijn project vereist delphi), en ik heb op verschillende fora rond gekeken. Wat ik echter vreemd vind is dat elk van de voorbeelden geheugen vrijmaakt voor een trustee structure, maar deze het achteraf niet meer vrijgeven. Waarom dat zo is begrijp ik niet. Wel heeft het mijn probleem niet weten op te lossen, want ik heb het geprobeerd.
PS: Om het overzichtelijk te houden heb ik wat commentaar verwijderd.
Ik heb de onderstaande functies gebruikt om de rechten van een bestand voor een specifieke user op te vragen.
Probleem:
Nu is het probleem dat er wat geheugen problemen zijn. De symptonen zijn keer op keer echter anders. Maar het probleem duikt telkens op wanneer de aanroep naar functie BuildTrusteeWithSid is gedaan.
Symptonen:
Na de aanroep is het de ene keer zo dat de zojuist op gevraagde acl structure verandert de andere keer is het zo dat er een memory exception optreedt. Deze symptonen wisselen elkaar af ook zonder dat de code opnieuw gecompileerd wordt.
Verdere info:
Ik heb al enkele dagen gezocht naar een bug, zo heb ik mijn programma vergeleken met verschillende C voorbeelden (mijn project vereist delphi), en ik heb op verschillende fora rond gekeken. Wat ik echter vreemd vind is dat elk van de voorbeelden geheugen vrijmaakt voor een trustee structure, maar deze het achteraf niet meer vrijgeven. Waarom dat zo is begrijp ik niet. Wel heeft het mijn probleem niet weten op te lossen, want ik heb het geprobeerd.
PS: Om het overzichtelijk te houden heb ik wat commentaar verwijderd.
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| function TForm1.GetSecurityDetails(ObjectName: string):Cardinal; // GetSecurityDetails() takes as argument a file or directory and // permissions for the user indicated on the form var strObjectName :string; strComputerName :string; // global API variables pACL_Data : PACL; pSecurityDescriptor : PSECURITY_DESCRIPTOR; error : DWORD; // error code pAccountSID : PSID; // variables for GetExplicitEntriesFromAcl() pAccessRights :Cardinal; tstUser :TRUSTEE; begin strObjectName := ObjectName; if edit2.Text = '' then begin ShowMessage('User Name required'); Result := 0; exit; end; strComputerName := ''; if(checkbox1.Checked) then edit1.Text := strComputerName; pAccountSID := GetUserSID(edit2.Text, PAnsiChar(strComputerName)); if pAccountSID = nil then begin Result := 0; exit; end; error := GetNamedSecurityInfo( PAnsiChar(strObjectName), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, @pACL_Data, nil, pSecurityDescriptor); if error <> ERROR_SUCCESS then begin showMessage('GetNamedSecurityInfo returned an error '); Result := 0; exit; end; // fill a trustee object BuildTrusteeWithSid(@tstUser, pAccountSID); error := GetEffectiveRightsFromAcl(pACL_Data^, tstUser, pAccessRights); if error <> ERROR_SUCCESS then begin showMessage('GetEffectiveRightsFromAcl returned an error '); Result := 0; exit; end; // free up the allocated memory FreeMem(pAccountSID); LocalFree(HLOCAL(pSecurityDescriptor)); result := pAccessRights; end; function TForm1.GetUserSID(aUserName: string; aComputerName:PAnsiChar):PSID; // GetUserID() looks up the SID of the user with the given arguments, // aComputerName can be nil, the account of the user will then be var // variables for LookupAccountName() strAccountName :PAnsiChar; strComputerName :PAnsiChar; pAccountSID :PSID; lpDomain :PChar; szSIDBuffer :DWORD; szDomainBuffer :DWORD; peUser :SID_NAME_USE; begin // initialise variables strAccountName := PAnsiChar(aUserName); strComputerName := PAnsiChar(aComputerName); szDomainBuffer := 0; szSIDBuffer := 0; // get the security id (SID) of an account // first request the required size of the buffers LookupAccountName(strComputerName, strAccountName, nil, szSIDBuffer, nil, szDomainBuffer, peUser ); // The only valid error is buffer overflow if GetLastError <> ERROR_INSUFFICIENT_BUFFER then begin showMessage('LookupAccountName did not return the '); Result := nil; Exit; end; // allocate the required memory needed for the information GetMem(pAccountSID, szSIDBuffer); GetMem(lpDomain, szDomainBuffer); // get the security id (SID) of an account if not( LookupAccountName(strComputerName, strAccountName, pAccountSID, szSIDBuffer, lpDomain, szDomainBuffer, peUser ) ) then begin FreeMem(pAccountSID); FreeMem(lpDomain); showMessage('LookupAccountName returned an error '); Result := nil; exit; end; FreeMem(lpDomain); Result := pAccountSID; end; |
All your quantifications are belong to me!