LsaEnumerateAccountRights始终返回"找不到文件"

Ala*_*ett 3 security winapi

我打电话有从LsaOpenPolicy政策手柄和LookupAccountName帐户的SID ADVAPI32.DLL LsaEnumerateAccountRights功能.

然而,尝试为我可能,我总是又回到0xC0000034它通过LsaNtStatusToWinError翻译后给我"引用的文件不能被发现."

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

最终结果是该帐户确实具有所需的权限,因此代码的整体运行.

但是,我在MSI自定义操作中使用它,安装检查以查看该帐户是否有权,如果没有(或如上所述失败),它授予权限并记住它已在安装中完成州.如果发生回滚并且添加了正确的回滚,则将其删除.我们从未在卸载中删除,因为其他应用程序可能已使用我们运行的服务所使用的相同域帐户进行安装.

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

任何想法 - 请注意,我使用C#与DllImport属性,露出Win32函数,和我之前C#有就是Unix不是世界上最好的Win32编程!

小智 8

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

回顾一下,我现在看到msdn文档中有一条线索:"此函数返回的帐户直接通过用户帐户保留指定的权限,而不是作为组成员身份的一部分."

请参阅:链接文本

完全按照您的说法从LsaOpenPolicy()获取策略句柄,从LookupAccountName()获取帐户SID.

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

如果你在一个用户名上调用它的权限,该用户名的权利完全来自它所属的组,那么它返回0xc0000034(= Windows错误2 - 系统找不到指定的"文件"),意思是(我们现在意识到)"不能找到任何单独分配的附加权利".似乎Windows错误2翻译是一个全能的"你找不到的东西".

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

ntrights + r SeNetworkLogonRight -u MyUserName

然后,LsaEnumerateAccountRights()工作正常,返回没有错误并枚举单个权限,"SeNetworkLogonRight".