Обработка прав безопасности и доступа

Модель безопасности Microsoft Windows позволяет управлять доступом к объектам обработки. Дополнительные сведения о безопасности см. в разделе "Модель управления доступом".

Когда пользователь входит в систему, система собирает набор данных, однозначно определяющих пользователя во время проверки подлинности, и сохраняет его в маркере доступа. Этот маркер доступа описывает контекст безопасности всех процессов, связанных с пользователем. Контекст безопасности процесса — это набор учетных данных, предоставленных процессу или учетной записи пользователя, создавшего процесс.

Маркер можно использовать для указания текущего контекста безопасности для процесса с помощью функции CreateProcessWithTokenW . Дескриптор безопасности для процесса можно указать при вызове функции CreateProcess, CreateProcessAsUser или CreateProcessWithLogonW. Если задано значение NULL, процесс получает дескриптор безопасности по умолчанию. Списки управления доступом в дескрипторе безопасности по умолчанию для процесса поступают из основного или олицетворения маркера создателя.

Чтобы получить дескриптор безопасности процесса, вызовите функцию GetSecurityInfo . Чтобы изменить дескриптор безопасности процесса, вызовите функцию SetSecurityInfo .

Допустимые права доступа для объектов процесса включают стандартные права доступа и некоторые права доступа для конкретного процесса. В следующей таблице перечислены стандартные права доступа, используемые всеми объектами.

Значение Значение
DELETE (0x00010000L) Требуется для удаления объекта.
READ_CONTROL (0x00020000L) Требуется для чтения сведений в дескрипторе безопасности для объекта, не включая сведения в SACL. Чтобы прочитать или записать saCL, необходимо запросить право доступа ACCESS_SYSTEM_SECURITY . Дополнительные сведения см. в разделе SACL Access Right.
SYNCHRONIZE (0x001000000L) Право на использование данного объекта для синхронизации. Это позволяет потоку ждать, пока объект не находится в сигнальном состоянии.
WRITE_DAC (0x00400000L) Требуется для изменения DACL в дескрипторе безопасности для объекта.
WRITE_OWNER (0x00800000L) Требуется изменить владельца в дескрипторе безопасности для объекта.

 

В следующей таблице перечислены права доступа, относящиеся к процессу.

Значение Значение
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) | SYNCHRONIZE (0x001000000L) | 0xFFFF) Все возможные права доступа для объекта процесса. Windows Server 2003 и Windows XP: размер флага PROCESS_ALL_ACCESS увеличен на Windows Server 2008 и Windows Vista. Если приложение, скомпилированное для Windows Server 2008 и Windows Vista, выполняется в Windows Server 2003 или Windows XP, флаг PROCESS_ALL_ACCESS слишком велик, а функция, указывающая этот флаг, завершается сбоем с ERROR_ACCESS_DENIED. Чтобы избежать этой проблемы, укажите минимальный набор прав доступа, необходимых для операции. Если PROCESS_ALL_ACCESS необходимо использовать, задайте _WIN32_WINNT минимальной операционной системе, предназначенной для приложения (например, #define _WIN32_WINNT _WIN32_WINNT_WINXP). Дополнительные сведения см. в разделе "Использование заголовков Windows".
PROCESS_CREATE_PROCESS (0x0080) Требуется использовать этот процесс в качестве родительского процесса с PROC_THREAD_ATTRIBUTE_PARENT_PROCESS.
PROCESS_CREATE_THREAD (0x0002) Требуется для создания потока в процессе.
PROCESS_DUP_HANDLE (0x0040) Требуется для дублирования дескриптора с помощью DuplicateHandle.
PROCESS_QUERY_INFORMATION (0x0400) Требуется для получения определенных сведений о процессе, таких как его токен, код выхода и класс приоритета (см. раздел OpenProcessToken).
PROCESS_QUERY_LIMITED_INFORMATION (0x1000) Требуется для получения определенных сведений о процессе (см. раздел GetExitCodeProcess, GetPriorityClass, IsProcessInJob, QueryFullProcessImageName). Дескриптор с правом доступа PROCESS_QUERY_INFORMATION автоматически предоставляется PROCESS_QUERY_LIMITED_INFORMATION. Windows Server 2003 и Windows XP: это право доступа не поддерживается.
PROCESS_SET_INFORMATION (0x0200) Требуется для задания определенных сведений о процессе, например о его классе приоритета (см. раздел SetPriorityClass).
PROCESS_SET_QUOTA (0x0100) Требуется для установки ограничений памяти с помощью SetProcessWorkingSetSize.
PROCESS_SUSPEND_RESUME (0x0800) Требуется для приостановки или возобновления процесса.
PROCESS_TERMINATE (0x0001) Требуется для завершения процесса с помощью TerminateProcess.
PROCESS_VM_OPERATION (0x0008) Требуется для выполнения операции с адресным пространством процесса (см. раздел VirtualProtectEx и WriteProcessMemory).
PROCESS_VM_READ (0x0010) Требуется для чтения памяти в процессе с помощью ReadProcessMemory.
PROCESS_VM_WRITE (0x0020) Требуется для записи в память в процессе с помощью WriteProcessMemory.
SYNCHRONIZE (0x001000000L) Требуется дождаться завершения процесса с помощью функций ожидания.

 

Чтобы открыть дескриптор для другого процесса и получить права полного доступа, необходимо включить привилегию SeDebugPrivilege . Дополнительные сведения см. в разделе "Изменение привилегий" в маркере.

Дескриптор, возвращаемый функцией CreateProcess, имеет PROCESS_ALL_ACCESS доступ к объекту процесса. При вызове функции OpenProcess система проверяет запрошенные права доступа на соответствие DACL в дескрипторе безопасности процесса. При вызове функции GetCurrentProcess система возвращает псевдоhandle с максимальным доступом, который daCL разрешает вызывающей программе.

Вы можете запросить ACCESS_SYSTEM_SECURITY права доступа к объекту процесса, если вы хотите прочитать или записать saCL объекта. Дополнительные сведения см. в статьях о списках управления доступом (ACL) и правах доступа К SACL.

Предупреждение

Процесс, имеющий некоторые права доступа, отмеченные здесь, может использовать их для получения других прав доступа. Например, если процесс A имеет дескриптор для обработки B с PROCESS_DUP_HANDLE доступа, он может дублировать псевдо-дескриптор для процесса Б. При этом создается дескриптор с максимальным доступом к процессу Б. Дополнительные сведения о псевдообработках см. в разделе GetCurrentProcess.

 

Защищенные процессы

Windows Vista предоставляет защищенные процессы для повышения поддержки цифровых Rights Management. Система ограничивает доступ к защищенным процессам и потокам защищенных процессов.

Следующие стандартные права доступа не допускаются из процесса в защищенный процесс:

  • DELETE
  • READ_CONTROL
  • WRITE_DAC
  • WRITE_OWNER

Следующие определенные права доступа не допускаются из процесса в защищенный процесс:

  • PROCESS_ALL_ACCESS
  • PROCESS_CREATE_PROCESS
  • PROCESS_CREATE_THREAD
  • PROCESS_DUP_HANDLE
  • PROCESS_QUERY_INFORMATION
  • PROCESS_SET_INFORMATION
  • PROCESS_SET_QUOTA
  • PROCESS_VM_OPERATION
  • PROCESS_VM_READ
  • PROCESS_VM_WRITE

Было введено PROCESS_QUERY_LIMITED_INFORMATION право предоставить доступ к подмножества информации, доступной через PROCESS_QUERY_INFORMATION.