检查给定用户是否具有给定权限

And*_*ykh 16 windows permissions users windows-server-2008-r2

给定一对用户和权限,我需要确定用户是否在服务器上具有权限。以下在我的设置中是正确的:

  • 服务器是域的一部分,但不是域控制器
  • 基础设施中存在多个具有信任关系的域
  • 有时,用户(本地、域或来自不同域)可以属于本地组,因为他们属于某个属于本地组的其他组(域或本地),而不是直接属于该组。

最后一点的示例场景:

  • 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 部分没有任何问题,但是根据特权检查帐户的最后一步是我正在努力寻找一种简单的检查方法。我也想自动化检查,因为这是需要定期进行的事情。

And*_*ykh 1

访问令牌没有有关权限的信息,只有有关特权的信息。

你需要做的是这样的:

  • 找到与您的应用程序池对应的 IIS 工作进程。由于您知道应用程序池标识,因此通过枚举具有工作进程名称的所有进程并过滤具有该标识的进程应该很容易。如果有多个,则可以使用任何一个。
  • 将 GetTokenInformation 与 TokenGroup 信息类一起使用,而不是进程令牌上的 TokenPrivilege。结果将为您提供身份所属的所有传递组。这甚至意味着间接的。
  • 现在,您可以循环遍历这些组并对每个组调用LsaEnumerateAccountRights并整理信息。这会给你你想要的。

以上依赖于账户身份对应的进程(和token)的存在。在您的情况下,这应该不是问题。在出现问题的情况下,您可以尝试使用 Active Directory 查找令牌组计算属性本文列出了实现这一目标的几种方法。