Как работает AccessCheck
Когда поток пытается получить доступ к защищаемому объекту, система предоставляет или запрещает доступ. Если у объекта нет дискреционного списка управления доступом (DACL), система предоставляет доступ; в противном случае система ищет записи управления доступом (ACEs) в DACL объекта, применяемые к потоку. Каждый ACE в DACL объекта указывает права доступа, разрешенные или запрещенные для доверенного лица, которое может быть учетной записью пользователя, учетной записью группы или сессией входа.
Дискреционные списки контроля доступа
Система сравнивает доверенное лицо в каждом ACE с доверенными лицами, указанными в токене доступа потока . Маркер доступа содержит идентификаторы безопасности (SID), которые определяют пользователя и учетные записи группы, к которым принадлежит пользователь. Маркер также содержит идентификатор безопасности входа в систему , определяющий текущий сеанс входа. Во время проверки доступа система игнорирует групповые SID, которые не включены. Дополнительные сведения о включенных, отключенных и только запрещающих SID см. в разделе Атрибуты SID в маркере доступа.
Как правило, система использует первичный токен доступа потока, запрашивающего доступ. Однако если поток олицетворяет другого пользователя, система использует токен олицетворения потока .
Система проверяет каждый ACE в последовательности до тех пор, пока не произойдет одно из следующих событий:
- ACE, запрещающий доступ, явно отказывает в любом из запрошенных прав доступа одному из доверенных лиц, перечисленных в токене доступа потока.
- Одно или несколько разрешенных для доступа acEs для доверенных лиц, перечисленных в маркере доступа потока, явно предоставляют все запрошенные права доступа.
- Все записи контроля доступа были проверены, и по-прежнему существует хотя бы одно запрошенное право доступа, которое не было явно разрешено; в этом случае доступ считается неявно запрещенным.
На следующем рисунке показано, как DACL объекта может разрешить доступ к одному потоку при запрете доступа к другому.
Для Потока A система считывает ACE 1 и немедленно запрещает доступ, так как отказ в доступе применяется к пользователю в токене доступа потока. В этом случае система не проверяет acEs 2 и 3. Для Thread B ACE 1 не применяется, поэтому система переходит к ACE 2, которая разрешает доступ на запись и ACE 3, что позволяет читать и выполнять доступ.
Поскольку система прекращает проверку ACE, когда запрошенный доступ явно разрешен или запрещен, порядок ACE в DACL важен. Обратите внимание, что если порядок ACE отличался в примере, система могла предоставить доступ к Thread A. Для системных объектов операционная система определяет предпочтительный порядок acEs вDACL.