组策略说我应该拥有它

组策略说我应该拥有它

Windows 中的用户可以被授予各种特权

权限决定了用户帐户可以执行的系统操作类型。管理员将权限分配给用户和组帐户。每个用户的权限包括授予用户的权限以及授予用户所属组的权限。

目前共有 35 项特权。其中一些比较有趣的特权包括:

  • 系统时间权限:需要修改系统时间。
  • 时区权限:需要调整与计算机内部时钟相关的时区
  • 备份权限:此权限使系统授予对任何文件的所有读取访问控制权,而不管为该文件指定的访问控制列表 (ACL) 是什么。
  • SeCreatePagefilePrivilege:需要创建分页文件。
  • 远程关机权限:需要使用网络请求关闭系统。
  • 调试权限:需要调试和调整另一个帐户拥有的进程的内存。

但我感兴趣的是:

  • SeShutdown权限:需要关闭本地系统。

我注意到我实际上并没有此权限。从提升的命令提示符中:

>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
   ...

使用时可确认这一点进程探索器检查以我身份运行的提升进程的安全令牌:

在此处输入图片描述

然而我关闭系统。为什么?

组策略说我应该拥有它

如果您使用本地安全策略编辑器管理单元(secpol.msc),您会看到我应该享有特权:

  • 安全警察管理系统

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

      在此处输入图片描述

说明特权:

关闭系统

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

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

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

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

我是一个用户. 有时我是一个行政人员而其他时候我非管理员

也许问题应该是为什么我很荣幸。

但事实是,我没有这个权限;但是当本地登录时,我可以关闭本地系统。

为什么?


@Mehrdad 有一个很好的答案,但他删除了,我认为这值得关注,并且简洁明了地回答了问题:

权限。默认情况下,它只是被禁用。如果你没有权限,那么它根本不会被列出
注意 这与缺乏或SE_PRIVILEGE_REMOVED不同 。SE_PRIVILEGE_ENABLEDSE_PRIVILEGE_ENABLED_BY_DEFAULT

额外阅读

答案1

您有权限,但是已禁用。这就是 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/关于所有这些事情。

答案2

这是因为您的用户属于已启用该权限的组。

要亲自查看哪些组:

  • 以管理员身份打开 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

相关内容