- •Операционные системы и их интерфейсы.
- •Графические ос
- •Речевые ос
- •Динамически подключаемые библиотеки.
- •Потоки и процессы.
- •Локальная память потока
- •Потоки в Windows.
- •Сервисы в Windows
- •7. Процессы в виндовс
- •8.Работа с сервисами виндовс
- •Синхронизация.
- •Система информационной безопасности
- •Синхронизация потоков в Windows
- •Управление безопасностью в Windows
- •3. Управляемый доступ к сети
- •13. Взаимоисключающий доступ к переменным
- •Управление пользователями
- •Управление группами
- •Структура консольного приложения
- •Работа с идентификаторами безопасности
- •19, Работа с консолью
- •20. Работа с дескрипторами безопасности
- •21. Работа с окном консоли
- •Часть III. Программирование консольных приложений
- •22. Работа со списками управления доступом на высоком уровне
- •23. Работа с буфером экрана
- •24. Работа с привилегиями
- •Ввод-вывод на консоль
- •Работа с маркерами доступа
- •Первичный маркер доступа
- •Имперсонализирующие маркер доступа
- •Передача данных
- •Работа со списками управления доступом на низком уровне
- •Работа с анонимными каналами в Windows
- •Управление безопасностью объектов на низком уровне
- •Глава 45. Управление безопасностью объектов на низком уровне 993
- •31) Работа с именованными каналами в Windows
- •32) Win32 и Win64. Программирование в среде Win64.
- •33) Работа с почтовыми ящиками в Windows
- •34) Использование файловой системы и функций символьного ввода/вывода Windows
- •35) Фреймовая обработка исключений
- •36) Усовершенствованные средства для работы с файлами и каталогами и знакомство с реестром
- •37. Финальная обработка исключений
- •38. Обработка исключений
- •39. Виртуальная память
- •40 . Управление памятью, отображение файлов и библиотеки dll
- •41. Работа с виртуальной памятью в windows
- •42.Управление процессами
- •43. Работа с кучей в Windows
- •44. Потоки и планирование выполнения
- •45. Общие концепции управления файлами
- •46. Синхронизация потоков
- •47. Работа с файлами в Windows
- •48. Влияние синхронизации на производительность и рекомендации по ее повышению
- •49) Работа с каталогами (папками) в Windows
- •50) Усовершенствованные методы синхронизации потоков
- •51) Асинхронный вызов процедур
- •52) Взаимодействие между процессами
- •53) Асинхронный доступ к данным.
- •54) Сетевое программирование с помощью сокетов Windows
- •55)Порты завершения
- •57)Работа с ожидающим таймером
- •58)Асинхронный ввод/вывод и порты завершения
- •Порты завершения ввода-вывода
- •59)Отображение файлов в память.
- •Достоинства метода. Альтернативой отображению может служить прямое чтение файла или запись в файл. Такой способ работы менее удобен по следующим причинам:
- •60)Безопасность объектов Windows
- •Операционные системы и их интерфейсы.
Работа с идентификаторами безопасности
Структура идентификатора безопасности
Идентификатор безопасности (SID) является бинарным представлением учетной записи, которое используется операционной системой для управления доступом к объектам. В операционных системах Windows идентификаторы безопасности представляются структурой
следующего типа:
typedef struct _SID {
BYTE Revision; // версия SID
BYTE SubAuthorityCount; // количество относительных идентификаторов
SID_IDENTIFIER_AUTHORITY IdentifierAuthority; // авторизация
DWORD SubAuthority[ANYSIZE_ARRAY]; // относительные идентификаторы
} SID;
Отсюда видно, что структура sid имеет переменную длину, которая зависит от количества относительных идентификаторов учетной записи. Идентификатор безопасности должен содержать идентификатор учетной записи, который хранится в поле IdentifierAuthority И, по крайней мере, один относительный идентификатор учетной записи. Идентификатор учетной записи, который определяет ее уровень авторизации или, другими словами, принадлежность учетной записи какому-то множеству учетных записей, задается структурой типа:
typedef struct _SID_IDENTIFIER_AUTHORITY {
BYTE Value[6]; // значение идентификатора учетной записи
} SID.IDENTIFIER.AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
Так как структура sid имеет переменную длину, зависящую от количества относительных идентификаторов учетной записи, то, прежде чем создавать идентификатор безопасности,
нужно определиться с количеством относительных идентификаторов, а затем зарезервировать память для структуры sid. Для определения длины структуры sid, учитывая количество относительных идентификаторов, используется функция GetSidLengthRequired. После этого резервируется Память для структуры sid. Сама структура sid инициализируется при помощи функции InitializeSid, причем эта функция инициализирует только первые три члена структуры sid. Относительные идентификаторы должны инициализироваться отдельно, вручную. Для вычисления адреса относительного идентификатора безопасности по его индексу в структуре sid используется функция GetSidSubAuthority. После инициализации sid нужно проверить его структуру — для этого используется функция isvaiidsid. Все вышеперечисленные действия можно также выполнить одной функцией
AiiocateAndinitiaiizeSid, которая резервирует память для структуры типа sid и инициализирует ее. Однако в этом случае зарезервированную память нужно освобождать, используя функциию FreeSid.
Для определения длины буфера памяти, который потребуется для создания
Идентификатора безопасности, ИСПОЛЬЗуеТСЯ фуНКЦИЯ GetSidLengthRequired,
которая имеет следующий прототип:
DWORD GetSidLengthRequired(
UCHAR nSubAuthorityCount // количество относительных идентификаторов
);
Единственный параметр этой функции должен содержать количество
относительных идентификаторов, которые предполагается записать в идентификатор безопасности. Функция GetSidLengthRequired всегда успешно завершает свою работу и возвращает количество байт, требуемых для хранения идентификатора безопасности.
Для инициализации идентификатора безопасности используется функция
InitializeSid, которая имеет следующий прототип:
BOOL InitializeSid(
PSID pSid, // указатель на идентификатор безопасности
// указатель на идентификатор учетной записи
PSID_IDENTIFIER_AUTHORITY pldent i f ierAuthori ty,
BYTE nSubAuthorityCount // количество относительных идентификаторов
);
В случае успешного завершения функция InitializeSid возвращает
ненулевое значение, а в случае неудачи — false. При неудаче код ошибки
можно определить посредством вызова функции GetLastError.
