20

Пользователям в Windows могут быть предоставлены различные привилегии

Привилегии определяют тип системных операций, которые может выполнять учетная запись пользователя. Администратор назначает права для учетных записей пользователей и групп. Привилегии каждого пользователя включают привилегии, предоставленные пользователю и группам, к которым он принадлежит.

В настоящее время 35 привилегий. Вот некоторые из наиболее интересных:

  • SeSystemtimePrivilege: требуется для изменения системного времени.
  • SeTimeZonePrivilege: требуется для настройки часового пояса, связанного с внутренними часами компьютера
  • SeBackupPrivilege: эта привилегия заставляет систему предоставлять все права доступа для чтения любому файлу, независимо от списка управления доступом (ACL), указанного для файла.
  • SeCreatePagefilePrivilege: необходим для создания файла подкачки.
  • SeRemoteShutdownPrivilege: требуется для выключения системы с помощью сетевого запроса.
  • SeDebugPrivilege: требуется для отладки и настройки памяти процесса, принадлежащего другой учетной записи.

Но то, что меня интересует, это:

  • SeShutdownPrivilege: требуется для выключения локальной системы.

Я заметил, что на самом деле у меня нет этой привилегии. Из командной строки с повышенными правами:

>whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                  Description                               State
=============================== ========================================= ========
SeIncreaseQuotaPrivilege        Adjust memory quotas for a process        Disabled
SeSecurityPrivilege             Manage auditing and security log          Disabled
SeTakeOwnershipPrivilege        Take ownership of files or other objects  Disabled
   ...
SeShutdownPrivilege             Shut down the system                      Disabled
   ...

Это подтверждается при использовании Process Explorer для проверки токена безопасности процесса с повышенными правами, запущенного от имени пользователя:

И все же я могу выключить систему. Зачем?

Групповая политика говорит, что я должен иметь это

Если вы используете оснастку редактора локальной политики безопасности (secpol.msc), вы увидите, что у меня должна быть привилегия:

  • secpol.msc

    • Настройки безопасности
    • Местные Политики
    • Назначение прав пользователя
    • Выключить систему

Объяснение привилегии:

Выключить систему

Этот параметр безопасности определяет, какие пользователи, которые локально вошли в систему компьютера, могут завершить работу операционной системы с помощью команды «Завершение работы». Неправильное использование этого права пользователя может привести к отказу в обслуживании.

По умолчанию на рабочих станциях: администраторы, операторы резервного копирования, пользователи.

По умолчанию на серверах: администраторы, операторы резервного копирования.

По умолчанию на контроллерах домена: администраторы, операторы резервного копирования, операторы сервера, операторы печати.

Я Пользователь. Иногда я администратор, а иногда я не администратор.

Возможно, вопрос должен заключаться в том, почему у меня нет привилегии.

Но реальность такова, что у меня нет привилегии; и все же при локальном входе в систему я могу выключить локальную систему.

Зачем?


У @Mehrdad был хороший ответ, который он удалил, что, я думаю, заслуживает внимания и отвечает на вопрос красиво и лаконично:

У вас есть привилегия. По умолчанию это просто отключено. Если бы у вас не было этой привилегии, ее бы не было в списке.
Обратите внимание, что SE_PRIVILEGE_REMOVED отличается от отсутствия SE_PRIVILEGE_ENABLED или SE_PRIVILEGE_ENABLED_BY_DEFAULT .

Бонус Чтение

2 ответа2

29

У вас есть разрешение, но оно отключено. Вот что говорит PowerShell.

Для выключения системы вы используете функцию Win32API, которая называется InitiateSystemShutdown или ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0);

Примечание этих функций:

Чтобы завершить работу локального компьютера, вызывающий поток должен иметь привилегию SE_SHUTDOWN_NAME. По умолчанию пользователи могут включить привилегию SE_SHUTDOWN_NAME на компьютере, на котором они вошли, а администраторы могут включить привилегию SE_REMOTE_SHUTDOWN_NAME на удаленных компьютерах.

Как видите, Windows проверяет привилегии потоков (любой поток имеет токен с привилегиями). Если вы вызываете ExitWindowsEx без привилегии SE_SHUTDOWN_NAME , функция завершится с ошибкой:

Error code: 1314
A required privilege is not held by the client

Потоки, которые вы создаете по умолчанию, наследуют ваши привилегии; но программа может включить отключенную привилегию, которая была предоставлена с помощью AdjustTokenPrivileges:

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = LookupPrivilegeValue(NULL, "SeShutdownPrivilege");
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

HANDLE processToken = OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES);
AdjustTokenPrivileges(processToken, false, tp, 0, NULL, NULL);
CloseHandle(processToken);

Изменение привилегий в токене говорит:

AdjustTokenPrivileges не может добавлять или удалять привилегии из токена. Он может включать только существующие привилегии, которые в данный момент отключены, или отключать существующие привилегии, которые в данный момент включены


Итак, почему эта привилегия отключена по умолчанию? Чтобы убедиться, что ни одна программа не может закрыть Windows случайно. Приложения должны запрашивать это явно.

Есть древняя, но очень хорошая книга: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ обо всем этом.

5

Это потому, что ваш пользователь принадлежит к группе, для которой эта привилегия включена.

Чтобы увидеть для себя, какие группы:

  • Откройте PowerShell (или командную строку) от имени администратора.
  • Запустите secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG .
  • Просмотрите содержимое файла OutFile.cfg в блокноте или аналогичном и найдите запись SeShutdownPrivilege . Вы должны (должны) увидеть пару / несколько идентификаторов безопасности для пользователей и / или групп, для которых эта привилегия включена.

Итак, у меня есть три коротких SID. Короткие идентификаторы обычно представляют собой учетные записи / группы на уровне компьютера. Например, один из них S-1-5-32-545 .

Используя PowerShell, мы можем определить, какую учетную запись / группу представляет SID:

$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-545")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value

Это возвращает BUILTIN\Users .

Поскольку вы являетесь пользователем этого компьютера, вы автоматически становитесь членом этой группы, то есть вы можете выключить компьютер.

Два других, которые у меня есть, это S-1-5-32-544 и S-1-5-32-551 . Это стандартная группа BUILTIN\Administrators группа BUILTIN\Backup Operators . Какую линию с группами вы видите в диалоге secpol.msc .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .