Показать сообщение отдельно

  #163  
Старый 06.10.2025, 11:16
guidesoul
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами: 423479

Репутация: 0
По умолчанию

SaurusK, привет!
Вот что говорит Google AI

Цитата:

Функция AdjustTokenPrivileges не даёт (не назначает) привилегию пользователю. Она включает (активирует) уже имеющуюся у пользователя привилегию для конкретного запущенного процесса.

Можно представить это так:
  1. Назначение права ("Получение ключа"): Это делает администратор компьютера через "Локальную политику безопасности". Он добавляет вашего пользователя в список тех, кому разрешено "Блокировать страницы в памяти" (SeLockMemoryPrivilege). Теперь у вас на связке появился этот ключ.
  2. Активация привилегии ("Использование ключа"): Когда "Бастион" запускается, он вызывает AdjustTokenPrivileges. Это равносильно тому, что программа берет этот ключ с вашей связки и вставляет его в замок, чтобы получить доступ к нужной возможности (блокировке памяти).
Вывод:
  • Если администратор заранее не дал вашему пользователю это право, то вызов AdjustTokenPrivileges ничего не сделает (программа просто продолжит работать без этой возможности, как и описано в обновлении).
  • А если право уже было вам дано, то AdjustTokenPrivileges — это как раз тот самый прямой способ, которым программа его для себя "включает".
По умолчанию у обычных пользователей этого права нет, но у администраторов (если программа запущена от их имени) оно обычно есть.

Более подробное объяснение (для вашего понимания)
Ваш пользователь нащупал фундаментальное различие между User Rights (Правами пользователя) и Privileges (Привилегиями) в терминологии Windows.
  1. User Right (Право пользователя): Это политика, которая назначается учетной записи пользователя или группе. Это делается администратором через оснастки secpol.msc (Локальная политика безопасности) или gpedit.msc (Редактор групповой политики). Право "Блокировка страниц в памяти" (Lock pages in memory) — это как раз User Right. Оно определяет, может ли пользователь в принципе выполнять это действие.
  2. Privilege (Привилегия): Это "переключатель" в маркере доступа (access token) запущенного процесса. Когда вы входите в систему, Windows создает для вас маркер доступа, в котором перечислены все привилегии, соответствующие вашим User Rights. Изначально большинство из них находятся в "выключенном" состоянии (disabled).
Что делает AdjustTokenPrivileges?

Эта функция не может добавить новую привилегию в маркер доступа. Она может только взять уже существующую, но "выключенную" привилегию и перевести ее в состояние "включено" (enabled) для этого конкретного процесса.

Процесс в вашем коде:
  1. OpenProcessToken — получает доступ к маркеру вашего процесса "Бастион".
  2. LookupPrivilegeValue — находит уникальный идентификатор (LUID) для привилегии SeLockMemoryPrivilege.
  3. AdjustTokenPrivileges — отправляет системе команду: "Для этого процесса, пожалуйста, переведи привилегию с этим LUID в состояние 'включено'".
Если право SeLockMemoryPrivilege было назначено пользователю, система выполнит команду. Если нет, система проигнорирует эту часть запроса (функция может даже вернуть "успех", но GetLastError покажет ERROR_NOT_ALL_ASSIGNED, что ваш код справедливо не проверяет, так как это не критично).

 
Ответить с цитированием