Как я могу выключить систему, если у меня нет SeShutdownPrivilege

2890
Ian Boyd

Пользователям в 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 для проверки токена безопасности процесса с повышенными правами, запущенного от имени пользователя:

Как я могу выключить систему, если у меня нет SeShutdownPrivilege

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

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

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

  • secpol.msc

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

      Как я могу выключить систему, если у меня нет SeShutdownPrivilege

Explaination привилегии:

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

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

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

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

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

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

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

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

Зачем?


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

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

Бонус Чтение

20
Ваша групповая политика, обрабатываемая доменом, переопределит вашу локальную групповую политику. Настройте разрешения домена вместо локальных разрешений. Когда вы запустили «whoami / priv:», в какую группу пользователей вы входили? Если я не совсем понял, о чем вы спрашиваете, отредактируйте ваш вопрос, потому что я только догадываюсь, что вы спрашиваете. Ramhound 6 лет назад 0
Я спрашиваю, почему я могу завершить работу системы, если мой маркер безопасности не имеет этой привилегии. Приходит ли привилегия с локальной машины или контроллера домена: в любом случае, у меня ее нет. Ian Boyd 6 лет назад 0
Снятие штепсельной вилки обходит все проблемы с привилегиями ... :) Конечно, зависит от того, как она перезагружается ... Solar Mike 6 лет назад 0

2 ответа на вопрос

29
user996142

У вас есть разрешение, но оно отключено . Вот что говорит 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/ обо всем этом.

Я на самом деле купил эту книгу пару лет назад; Я должен буду перечитать его. Ian Boyd 6 лет назад 0
Если вы знаете C, вы можете скачать VS сообщество (которое бесплатно) и попытаться завершить работу компьютера программно с привилегиями. Затем включите эту привилегию программно и попробуйте снова). Это лучший способ узнать что-нибудь о Windows :) user996142 6 лет назад 0
@ user996142 - что, выключив его? Думаю, ты прав. :) Jules 6 лет назад 0
5
Ƭᴇcʜιᴇ007

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

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

  • Откройте 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диалоге.