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_ENABLED
SE_PRIVILEGE_ENABLED_BY_DEFAULT
额外阅读
- MSDN:特权常量
- 技术网:关闭系统-用户权限分配
答案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-544
和S-1-5-32-551
。这些是标准BUILTIN\Administrators
组和BUILTIN\Backup Operators
组。它们与您在对话框中看到的组一致secpol.msc
。