gpt4 book ai didi

security - LsaEnumerateAccountRights 总是返回 "File not found"

转载 作者:行者123 更新时间:2023-12-03 19:39:07 25 4
gpt4 key购买 nike

我正在调用具有来自 LsaOpenPolicy 的策略句柄和来自 LookupAccountName 的帐户 SID 的 Advapi32.dll LsaEnumerateAccountRights 函数。

但是,尽我所能,我总是得到 0xC0000034,在 LsaNtStatusToWinError 翻译后,我得到“找不到引用的文件”。

这不是很好。我的代码处理了这个问题,并继续使用 LsaAddAccountRights 授予帐户 SID SeServiceLogonRight 的权限,所以我知道策略句柄和帐户 SID 很好,因为如果其中一个出现问题,它们会爆炸。

最终结果是该帐户确实拥有所需的权限,因此代码总体上有效。

但是,我在 MSI 自定义操作中使用它,安装检查帐户是否具有权限,如果没有(或如上所述失败),则授予权限并记住它已在安装中完成状态。如果发生回滚并且它添加了权利,然后将其删除。我们永远不会在卸载时删除,因为其他应用程序可能是使用我们运行的服务所使用的域帐户安装的。

所以问题是当 MSI 执行回滚时 - 它总是会删除权限,因为它总是认为它已经添加了它。因此,使用 LsaEnumerateAccountRights 检查权限用于此目的 - 但我无法让它工作。

任何想法 - 请注意,我使用带有 DllImport 属性的 c# 来公开 Win32 函数,而且我不是世界上最好的 Win32 程序员,在 C# 之前已经是 Unix!

最佳答案

我也一直在努力解决这个问题,但刚刚破解它......

回顾过去,我现在看到 msdn 文档中有一条线索:
“此函数返回的帐户直接通过用户帐户持有指定的权限,而不是作为组成员资格的一部分。”

见:link text

正如您所说,从 LsaOpenPolicy() 获取策略句柄,从 LookupAccountName() 获取帐户 SID。

如果您输入的用户名是组名(“用户”、“管理员”等),则 LsaEnumerateAccountRights() 可以正常工作并枚举该组的所有权限。

如果你使用一个用户名调用它,该用户名的权限完全来自它所属的组,那么它返回 0xc0000034(= Windows 错误 2 - 系统找不到指定的"file"),这意味着(我们现在意识到)“不能查找任何单独分配的附加权限”。似乎 Windows 错误 2 翻译是“未找到您要查找的内容”的统称。

现在...
如果您有 ntrights.exe,请运行它...例如:

ntrights +r SeNetworkLogonRight -u 我的用户名

然后,LsaEnumerateAccountRights() 工作正常,无错误返回并枚举单个权限“SeNetworkLogonRight”。

关于security - LsaEnumerateAccountRights 总是返回 "File not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1578879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com