给定一对用户和一个特权我需要确定用户是否具有服务器上的权限。在我的设置中,以下情况属实:
- 该服务器是域的一部分,但不是域控制器
- 基础设施中存在多个具有信任关系的域
- 有时,用户(本地、域或来自不同域)可以属于某个本地组,因为他们属于属于本地组的其他组(域或本地),而不是直接属于该组。
最后一点的示例场景:
- User1 属于 DomainA 中的 TeamA 组
- DomaimA\TeamA 是 DomainB\SpecialAccess 的成员
- DomainB\SpecialAccess 是 DomainB\DomainAdmins 的成员
- 最后,DomainB\DomainAdmins 属于本地管理员组
- 本地管理员组具有 SeRemoteInteractiveLogonRight 权限
现在,如果我输入了 DomainA\User1 和 SeRemoteInteractiveLogonRight,我需要得到是或否的答案。因此,我打开计算机上的本地策略,注意我感兴趣的右侧列出了哪些组,然后转到服务器管理器,查看组成员,然后我需要查看这些组中任何组的成员等等。
我有一种直觉,这可以更容易。当我发现AccessChk 实用程序我花了整整三分钟才发现它只列出了直接关系,因此不会列出组内的用户。
现在我猜想可以以某种方式组合 AccessChk 的结果,以便我可以检查用户是否属于 AccessChk 返回的任何组,但考虑到它不是一个单一的域,而是其中的几个,我不确定如何处理这个问题。此外,AccessChk 输出似乎没有区分组和用户。
编辑:本着不陷入 XY 问题陷阱的精神,我真正需要做的是确保在一组服务器上,用作 IIS 应用程序池标识的特定用户帐户没有 SeInteractiveLogonRight 或 SeRemoteInteractiveLogonRight 权限。我对 IIS 部分没有问题,但检查帐户是否具有权限的最后一步是我很难找到一种简单的检查方法。我还想自动进行检查,因为这是需要定期完成的事情。
答案1
访问令牌不包含有关权利的信息,仅包含有关特权的信息。
你需要做的是这样的:
- 找到与您的应用程序池相对应的 IIS 工作进程。由于您知道应用程序池标识,因此通过枚举具有工作进程名称的所有进程并筛选具有标识的进程,这应该很容易。如果有多个,您可以使用任何一个。
- 使用 GetTokenInformation 和 TokenGroup 信息类,而不是进程令牌上的 TokenPrivilege。结果将为您提供全部身份所属的传递群。这意味着甚至是间接的。
- 现在您可以循环遍历这些组并调用枚举帐户权限并整理信息。这将给你你想要的东西。
以上内容依赖于与帐户身份对应的进程(和令牌)的存在。在您的场景中,这应该不是问题。在出现问题的情况下,您可以尝试使用 Active Directory 查找Token-Groups 计算属性。本文列出了实现这一目标的几种方法。