-
MY PROJECTS
-
Recent Posts
- Linux. Ubuntu.Monitor resources
- Java.Algo.Get sum of Digits from int
-
Java. List
to int[] and backwards - Sql.Execution Order
- Algo.Java.BinarySearch
- SQL. Conditional expression with count()
- Java.Algo.CumulativeApproach
- Algo.Java.BFS in BinaryTree
- Java.Jackson.Serialize object to json
- Algo. Traverse linked list
- Algo. Java. Remove-duplicates-from-sorted-array
- Java.Hibernate.SimpleExample
- Java.Jdbc.SimpleExample
- SQL. Calc the sum with case, example
- Mullvad – free the internet :)
- Junit. Jupiter
- Java. SpringBoot Example how to work with dateTime in Specification
- Java.SpringBoot.PopularAnnotations
- SpringBoot. Exception Management
- Java.Hibernate.JoinTableAnnotation
Categories
- Aptana
- Azure
- C#
- DataSnap
- DBExpress
- Delphi
- Delphi и сети
- Delphi. Язык программирования
- ExtJS
- FastReport
- FireDAC
- FireMonkey
- GIT
- ICS
- IDE
- IIS
- Indy
- InnoSetup
- javascript
- jQuery
- JSON
- LiveBindings
- MSHTML
- MySQL
- PHP
- REST
- Ribbons
- SMS
- SQL инструкции
- SVN
- TRichView
- UniGui
- WebBroker
- WinAPI
- Windows
- Алгоритмы
- Без рубрики
- Деревья
- Ищу ответ
- Компонентостроение
- Мои компоненты
- Начальный уровень
- Обработка исключений
- Парсинг
- Потоки(Threads)
- Регулярные выражения
- Тестирование приложений
Category Archives: WinAPI
Delphi. WinAPI. Получение дескриптора безопасности файла
Получение дескриптора безопасности файла По мотивам обсуждения на форуме Способ №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 владельца объекта и группы
Delphi.WinAPI. Доступен ли файл для чтения?
Способ № 1 (Рабочий, почти всегда)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const FILE_READ_DATA = $0001; FILE_WRITE_DATA = $0002; FILE_APPEND_DATA = $0004; FILE_READ_EA = $0008; FILE_WRITE_EA = $0010; FILE_EXECUTE = $0020; FILE_READ_ATTRIBUTES = $0080; FILE_WRITE_ATTRIBUTES = $0100; FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE); FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE); FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or FILE_EXECUTE or SYNCHRONIZE); FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF; |
1 2 3 4 5 6 |
function TfMain.IsFileOKToread(AFilePath:String): Boolean; begin Result:=False; if CheckFileAccess(FilePathConst,FILE_READ_DATA) = FILE_READ_DATA then Result:=True; end; |
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 |
function CheckFileAccess(const FileName: string; const CheckedAccess: Cardinal): Cardinal; var Token: THandle; Status: LongBool; Access: Cardinal; SecDescSize: Cardinal; PrivSetSize: Cardinal; PrivSet: PRIVILEGE_SET; Mapping: GENERIC_MAPPING; SecDesc: PSECURITY_DESCRIPTOR; begin Result := 0; GetFileSecurity ( PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0, SecDescSize ); SecDesc := GetMemory(SecDescSize); if GetFileSecurity ( PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, SecDesc, SecDescSize, SecDescSize ) then begin ImpersonateSelf(SecurityImpersonation); OpenThreadToken(GetCurrentThread, TOKEN_QUERY, False, Token); if Token <> 0 then begin Mapping.GenericRead := FILE_GENERIC_READ; Mapping.GenericWrite := FILE_GENERIC_WRITE; Mapping.GenericExecute := FILE_GENERIC_EXECUTE; Mapping.GenericAll := FILE_ALL_ACCESS; MapGenericMask(Access, Mapping); PrivSetSize := SizeOf(PrivSet); AccessCheck(SecDesc, Token, CheckedAccess, Mapping, PrivSet, PrivSetSize, Access, Status); CloseHandle(Token); if Status then Result := Access; end; end; FreeMem(SecDesc, SecDescSize); end; |
1 2 3 4 5 |
procedure TfMain.bTestClick(Sender: TObject); begin if IsFileOKToread(FilePathConst) then ShowMessage('Ok To Read'); end; |
Способ №2 (Не рабочий, если доступ к файлу закрыт) Данная функция НЕ РАБОТАЕТ, так как нужно проверять атрибуты безопасности файла, насколько я понимаю. Простая проверка возможности прочитать файл. //True – файл … Continue reading
Delphi. Scrollbox. MousewheelUp and MousewheelDown. Делаем прокрутку разными способами
TScrollBox, Если мы говорим о классе TScrollBox, то наиболее простой и эффективный код – обработать MousewheelUp и MouseWheelDown у компонента ScrollBox, но этого недостаточно, нужно ещё присвоить SetFocus, компоненту ScrollBox, тогда это удовольствие будет работать. Вот простой пример обработки данных … Continue reading