[Win32] Probleem met gebruik van functies mbt ntfs rechten

Pagina: 1
Acties:

  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
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.

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!


  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
kick...

mocht het een en ander niet duidelijk zijn, laat het dan even weten.

All your quantifications are belong to me!


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ik denk niet dat je echt geluk hebt, lopen hier weinig mensen rond die ACL's kunnen dromen. Je kunt proberen Elevator een mailtje te sturen, die heeft er geloof ik wel ervaring mee.
Edsger schreef op 02 March 2003 @ 20:38:
PS: Om het overzichtelijk te houden heb ik wat commentaar verwijderd.
Ik betwijfel of dat de overzichtelijkheid ten goede komt in 129 regels code.... :X

Professionele website nodig?


  • The End
  • Registratie: Maart 2000
  • Laatst online: 10:36

The End

!Beginning

Voor zover ik Delphi code kan lezen zie ik nergens dat jij dat geheugen voor die TRUSTEE structure alloceert. Volgens de MSDN alloceert de functie geen geheugen.
Ook zie ik dat je niet controlleerd of de functie lukt of mislukt. De C++ (MSDN) versie van de call vermeld dat als de TRUSTEE struct (bij jou 'tstUser') null (nil) is dat dan de functie mislukt is.

Verwijderd

http://www.aldyn.ru/demos/0008/4.html :)

Kijk daar ook eens; dan lukt het vast wel :)

  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
The End schreef op 04 maart 2003 @ 10:40:
Voor zover ik Delphi code kan lezen zie ik nergens dat jij dat geheugen voor die TRUSTEE structure alloceert. Volgens de MSDN alloceert de functie geen geheugen.
Ook zie ik dat je niet controlleerd of de functie lukt of mislukt. De C++ (MSDN) versie van de call vermeld dat als de TRUSTEE struct (bij jou 'tstUser') null (nil) is dat dan de functie mislukt is.
Het geheugen wordt in mijn geval wel gealloceerd, ik gebruik namelijk geen pointer maar een instantie van de structuur zelf. Anders zou er moeten staan:

Delphi:
1
2
3
4
5
6
7
8
var tstuser: PTRUSTEE;
begin
  //....  even uit mijn hoofd inkloppen...
  GetMem(tstUser, sizeof(TRUSTEE));
  BuildTrusteeWithUser(tstUser, pSID);
  //doe wat met psid
  FreeMem(tstUser);
end;


deze constructie heb ik ook geprobeerd, maar deze crasht weer op het vrijgeven van het geheugen mbv FreeMem.
Verder doet BuildTrusteeWithUser niks retourneren (void).
Maar toch bedankt :-) Ik kan alle hulp gebruiken.

[ Voor 3% gewijzigd door Edsger op 04-03-2003 13:02 ]

All your quantifications are belong to me!


  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
curry684 schreef op 04 March 2003 @ 02:08:
Ik denk niet dat je echt geluk hebt, lopen hier weinig mensen rond die ACL's kunnen dromen.
Voor de echte tweaker behoort dat dan juist een uitdaging te zijn of niet soms :-)
Je kunt proberen Elevator een mailtje te sturen, die heeft er geloof ik wel ervaring mee.
Bedankt, als ik er niet uitkom met de andere 2 postings zal ik het zeker doen.
Ik betwijfel of dat de overzichtelijkheid ten goede komt in 129 regels code.... :X
Tsja, ik had wel wat meer kunnen weglaten, maar dan moet ik een lap tekst gaan schrijven wat even lastig is om door te nemen... maar zo onduidelijk is het toch niet? O-)

[ Voor 8% gewijzigd door Edsger op 04-03-2003 13:13 ]

All your quantifications are belong to me!


  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
Heel interessant... Ik zal kijken of ik er hiermee uitkom.

All your quantifications are belong to me!

Pagina: 1