Большинство функций ядра имеют параметр, в который вы должны передать указатель на TSecurityAttributes, и в который все всегда передают nil. Документация говорит, что в этом случае объект получает дескриптор безопасности по-умолчанию. Но что такое дескриптор безопасности по-умолчанию?
Мы начнём искать, конечно же, с MSDN - в разделе, озаглавленном Security Descriptors for New Objects.
Там сказано, что DACL по-умолчанию формируется из наследованных ACE (если объект принадлежит какой-либо иерархии, типа файловой системы или реестра) или же из первичного (primary) или имперсонированного (impersonation) токена создателя.
Но что такое первичный токен по-умолчанию?
А, чёрт, я тоже этого не знаю. Так что давайте напишем программку, чтобы узнать это.
usesЛадно, я признаю это: единственное назначение всего этого кода только в том, чтобы я вызывал функцию ConvertSecurityDescriptorToStringSecurityDescriptor - наверное, это самое длинное имя функции в Win32 API. А чтобы было ещё веселее, я использовал стиль именования переменных NT вместо венгерской нотации.
JwaWindows;
procedure TForm1.FormCreate(Sender: TObject);
var
Token: THandle;
RequiredSize: DWord;
DefaultDacl: PTokenDefaultDacl;
SD: TSecurityDescriptor;
StringSD: PChar;
begin
if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token) then
try
RequiredSize := 0;
GetTokenInformation(Token, TokenDefaultDacl, nil, 0, RequiredSize);
GetMem(DefaultDacl, RequiredSize);
try
if GetTokenInformation(Token, TokenDefaultDacl, DefaultDacl, RequiredSize, RequiredSize) and
InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) and
SetSecurityDescriptorDacl(@SD, True, DefaultDacl.DefaultDacl, False) and
ConvertSecurityDescriptorToStringSecurityDescriptor(@SD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, StringSD, nil) then
try
MessageBox(Handle, StringSD, 'Result', MB_OK);
finally
LocalFree(Cardinal(StringSD));
end;
finally
FreeMem(DefaultDacl);
end;
finally
CloseHandle(Token);
end;
end;
Если вы запустите эту программу, то увидите сообщение типа:
D:(A;;GA;;;S-1-5-21-1935655697-839522115-854245398-1003)(A;;GA;;;SY)Для расшифровки этой строки мы достаём наш полезнейший справочник по формату строкового представления дескриптора безопасности - Security Descriptor String Format:
- "D:" - указывает, что это DACL.
- "(A;;GA;;;S-...)" - Разрешить ("Allow") полный доступ ("Generic All") для "S-..." - что, кажется, является моим SID. Т.е. каждый пользователь по-умолчанию имеет полные права для своих процессов.
- "(A;;GA;;;SY)" - Разрешить ("Allow") полный доступ ("Generic All") для "Local System".
Смотрел недавно Jedi Security Library и недоумевал, что за секурити дескрипторы, и нужны ли они мне. Пока решил, что не нужны, и не стал разбираться.
ОтветитьУдалитьА на самом деле, когда их стоит использовать?