Получение дескриптора безопасности файла
По мотивам обсуждения на форуме
Способ №1
1 2 3 4 5 6 7 8 9 10 11 |
// Loading from DLL function ConvertSecurityDescriptorToStringSecurityDescriptor_( SecurityDescriptor: PSECURITY_DESCRIPTOR; RequestedStringSDRevision: DWORD; SecurityInformation: SECURITY_INFORMATION; StringSecurityDescriptor: PPChar; StringSecurityDescriptorLen: PCardinal ): Boolean; stdcall; external 'ADVAPI32.DLL' name {$IFDEF USEUNICODE}'ConvertSecurityDescriptorToStringSecurityDescriptorW'{$ELSE} 'ConvertSecurityDescriptorToStringSecurityDescriptorA'{$ENDIF}; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function TfMain.GetSecurityDescriptorInfoAboutFile(AFilePath:String):Boolean; var SD: PSECURITY_DESCRIPTOR; Len: Cardinal; s: PChar; begin GetFileSecurity(PChar(AFilePath), DACL_SECURITY_INFORMATION, nil, 0, Len); SD := HeapAlloc(GetProcessHeap, 8, Len); GetFileSecurity(PChar(AFilePath), DACL_SECURITY_INFORMATION, SD, Len, Len); ConvertSecurityDescriptorToStringSecurityDescriptor_(SD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, @s, @Len); HeapFree(GetProcessHeap, 0, SD); memo.Lines.Add(s) end; |
Способ №2 – дает информацию не только о DACL_SECURITY_INFORMATION, но и о SID владельца объекта и группы
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 |
//Loading from DLL function ConvertSecurityDescriptorToStringSecurityDescriptor_( SecurityDescriptor: PSECURITY_DESCRIPTOR; RequestedStringSDRevision: DWORD; SecurityInformation: SECURITY_INFORMATION; StringSecurityDescriptor: PPChar; StringSecurityDescriptorLen: PCardinal ): Boolean; stdcall; external 'ADVAPI32.DLL' name {$IFDEF USEUNICODE}'ConvertSecurityDescriptorToStringSecurityDescriptorW'{$ELSE} 'ConvertSecurityDescriptorToStringSecurityDescriptorA'{$ENDIF}; // Loading from DLL function GetNamedSecurityInfo_( pObjectName: PChar; //ObjectType: SE_OBJECT_TYPE; // Это НЕПРАВИЛЬНОЕ объявление! ObjectType: DWORD; // На самом деле WinAPI-функция GetNamedSecurityInfo ожидает 4-байтное значение SecurityInfo: SECURITY_INFORMATION; psidOwner: PPSID; psidGroup: PPSID; pDacl: PPACL; pSacl: PPACL; ppSecurityDescriptor: PPSECURITY_DESCRIPTOR ): DWORD; stdcall; external 'ADVAPI32.DLL' name {$IFDEF USEUNICODE}'GetNamedSecurityInfoW'{$ELSE}'GetNamedSecurityInfoA'{$ENDIF}; // Loading from DLL function ConvertSidToStringSid_( Sid: PSID; var StringSid:LPTSTR ): DWORD; stdcall; external 'ADVAPI32.DLL' name {$IFDEF USEUNICODE}'ConvertSidToStringSidW'{$ELSE}'ConvertSidToStringSidA'{$ENDIF}; function TfMain.GetSecurityInfoAboutFile(AFilePath:String):Boolean; var SD: PSECURITY_DESCRIPTOR; Len: Cardinal; s: PChar; ppsidOwner:PSID; ppsidGroup:PSID; begin Result:=false; GetNamedSecurityInfo_( PChar(AFilePath), Cardinal(SE_FILE_OBJECT), DACL_SECURITY_INFORMATION, ppsidOwner, ppsidGroup, nil, nil, @SD ); ConvertSecurityDescriptorToStringSecurityDescriptor_(SD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, @s, @Len); Memo.Lines.Add(s); end; |
Вот какой результат по способу 1 и способу 2 соответственно