给予特权时的PrivilegeNotHeldException

时间:2019-10-28 10:50:11

标签: windows winapi permissions

我正在通过程序创建Windows用户,并使用LsaAddAccountRights给创建的用户不同的特权。其中的一项特权是接收ACL信息所需的特权“ SeSecurityPrivilege”。

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

编写一个使用LsaEnumerateAccountRights查询特权的程序,表明用户具有特权。使用PrivilegeCheck进行检查,表明它们都已被禁用-在所有服务器上(即使在2019年也可以使用)。

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

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

1 个答案:

答案 0 :(得分:0)

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