【问题标题】:PrivilegeNotHeldException when privilege is given授予特权时出现 PrivilegeNotHeldException
【发布时间】:2020-02-23 15:20:30
【问题描述】:

我正在通过程序创建一个 Windows 用户,并使用 LsaAddAccountRights 为创建的用户提供不同的权限。除其他事项外,接收 ACL 信息所需的权限“SeSecurityPrivilege”。

这适用于许多不同的 Windows 版本:7、8.1x、10.x、Server 2019:用户运行的我的程序可以访问文件的 ACL(使用 C#FileInfo.GetAccessControl())。但这不适用于 Server 2008R2 和 2012R2。 (ATM 我无法测试 Server 2016)。所有服务器都是域控制器。使用“whoami /priv”检查权限显示,SeSecurityPrivilege 已在 Server 2019 上设置(但已禁用),但其他服务器未显示任何权限。

编写一个使用LsaEnumerateAccountRights 查询权限的程序表明用户拥有该权限。检查PrivilegeCheck 显示它们都已被禁用 - 在所有服务器上(甚至是 2019 年,它正在工作)。

检查组策略Group Policy at DC 显示该策略已分配给用户。

我的问题在哪里?为什么这在旧服务器版本上不起作用,而在新版本上起作用?

【问题讨论】:

  • 如果用户有权限但不在whoami /priv 列表中(启用或禁用),那么当用户登录时策略会将其过滤掉。尝试通过“以管理员身份运行”来提升用户。但是,如果权限已明确分配给用户而不是从管理员组间接获得,则需要提升是出乎意料的。

标签: windows winapi permissions


【解决方案1】:

即使特定帐户在大多数情况下都拥有给定的特权,大多数进程也会在禁用该特权的情况下运行。使用 AdjustTokenPrivileges 在每个进程的基础上启用特权(理想情况下,您只在实际需要的时候启用该特权,然后再重新禁用它)。请注意,您使用 LookupPrivilegeValue 来获取标识 AdjustTokenPrivileges 权限的 LUID。

【讨论】:

  • 我试过AdjustTokenPrivileges。这适用于 Windows 10、Server 2019 - 没有必要。但它在 Server 2008R2 上不起作用 - 没有错误,只是 PrivilegeCheck 保持“禁用”并且无法检索 ACL。
猜你喜欢
  • 2023-03-08
  • 2017-02-05
  • 2017-01-09
  • 2017-02-03
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2015-09-28
相关资源
最近更新 更多