【问题标题】:How to check if a user is a member of the Administrator's group by user name/domain如何通过用户名/域检查用户是否是管理员组的成员
【发布时间】:2016-08-22 09:33:11
【问题描述】:

如果我拥有的唯一信息是用户名(以及相关的域),我如何知道用户是否是管理员组的成员?

我确实知道如何为当前用户获取此信息。 但是,就我而言,我需要为尚未登录的用户获取此信息(我正在使用凭据提供程序)。因此,我只能使用用户名和域。

此问题仅与 Windows 机器有关。

我正在使用 C#/C++。

我知道 C# WindowsPrincipal 类如:WindowsPrincipal

我也知道 IsUserAnAdmin() Windows API。 但是,我不能使用这些方法,因为我正在处理尚未登录的用户(我的代码在用户实际进入 Windows 机器之前执行)

【问题讨论】:

  • 你试过 cmd-line net user /domain the_user_id 吗?它返回了很多东西。
  • 管理员权限是什么?文件,服务器,它们所在的电脑?你在运行一个网站,一个 Windows 应用程序,你是从 Windows 机器还是 unix 机器运行它?没有足够的信息可以帮助您
  • Windows 使用安全对象。访问对象(如文件或进程)的要求是为每个对象单独设置的。没有“此用户可以访问所有内容” 用户帐户,更不用说表明这一点的标志。你为什么不问真正的问题,而不是你的解决方案?
  • 让我重新表述我的问题:我需要找到一种编程方式来了解用户是否是管理员(管理员组的成员)。如果我能够获取当前用户的这些信息,我可以使用 IsUserAnAdmin() Windows API 或通过 WindowsPrincipal 类进行检查。我不能。我正在使用凭据提供程序,但用户尚未登录。
  • edit您的问题显示what you have tried so far。您应该包含您遇到问题的代码的minimal reproducible example,然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask

标签: c# c++ windows winapi credential-providers


【解决方案1】:

如果“几乎总是正确”足够好,您将需要递归枚举用户的组成员身份,以查看是否找到管理员组。这不是微不足道的,但也不是不合理的困难。没有内置库可以为您完成。

第一个问题是假设您对 Active Directory 有足够的访问权限来读取所有相关组。默认情况下,本地系统帐户可以执行此操作,但您需要禁止系统管理员更改组的安全权限,使域计算机无法读取组成员身份。

另外,我不确定凭据提供程序在什么安全上下文中运行,因此您可能需要运行一个单独的服务来代表您枚举域成员身份。

第二个问题是,这不包括特殊的安全主体,例如所有人、交互式等,但您可能会忽略这些——它们中的任何一个成为管理员组的成员都是非常不寻常的。如果您认为有必要,您可以尝试包含它们,或者您可以明确禁止系统管理员这样做。

可能根据需要重新架构会更明智,这样您在获得用户密码之前就无需做出此决定。

【讨论】:

  • 谢谢!我想我可以听从您的建议并枚举用户的组成员身份...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2011-10-02
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多