没有SeShutdownPrivilege时如何关闭系统


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

    • 安全设定
    • 当地政策
    • 用户权限分配
    • 关闭系统

      在此处输入图片说明

的特权:

关闭系统

此安全设置确定哪些本地登录到计算机的用户可以使用“关机”命令关闭操作系统。滥用此用户权限可能会导致拒绝服务。

工作站上的默认值:管理员,备份操作员,用户。

服务器上的默认设置:管理员,备份操作员。

域控制器上的默认值:管理员,备份操作员,服务器操作员,打印操作员。

我是用户。有时我是管理员,有时我是NotAdministrator

也许问题应该是我为什么没有特权。

但是现实是我没有特权。但是当本地登录时,我可以关闭本地系统。

为什么?


@Mehrdad删除了一个很好的答案,我认为这值得引起注意,并简洁简洁地回答了这个问题:

特权。默认情况下,它只是被禁用。如果您没有特权,那它根本不会列出
请注意 ,这SE_PRIVILEGE_REMOVED与缺少SE_PRIVILEGE_ENABLED或不同 SE_PRIVILEGE_ENABLED_BY_DEFAULT

奖励阅读


域处理的组策略将覆盖您的本地组策略。调整域权限,而不是本地权限。当你跑了,“WHOAMI /私法:,什么用户群是你的。如果我已经完全不明白你的要求,编辑的问题,因为我只是瞎猜你问什么?
Ramhound

我在问为什么我的安全令牌没有特权时可以关闭系统。特权来自本地计算机还是域控制器:无论哪种方式,我都没有。
伊恩·博伊德

拔下电源插头会解决所有特权问题... :)当然取决于重启的方式...
Solar Mike

Answers:


29

您具有权限,但已被禁用。这就是PowerShell告诉您的内容。

要关闭系统,请使用称为InitiateSystemShutdown或的Win32API函数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/关于所有这些东西。


实际上,几年前我买了那本书。我将不得不重新阅读。
伊恩·博伊德

如果您知道C,则可以下载VS社区(免费),并尝试以非特权方式以编程方式关闭PC。然后,以编程方式启用此priv,然后重试)。这是学习有关Windows的最好方法:)
user996142

@ user996142-什么,将其关闭?猜猜你是对的。:)
Jules

5

这是因为您的用户属于启用了该特权的组。

要亲自查看哪个组:

  • 以管理员身份打开PowerShell(或命令)提示。
  • 运行secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG
  • 在记事本或类似工具中查看OutFile.cfg的内容,然后查找SeShutdownPrivilege条目。您将(应该)为启用了该特权的用户和/或组看到几个/很少的SID。

因此,我列出了三个简短的SID。短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-544S-1-5-32-551。这些是标准BUILTIN\Administrators组,也是BUILTIN\Backup Operators组。哪个与您在secpol.msc对话框中看到的组对齐。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.