如何按用户名/域检查用户是否是管理员组的成员

时间:2016-08-22 09:33:12

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

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

我知道如何为当前用户获取此信息。 但是,在我的情况下,我需要为尚未登录的用户获取此信息(我正在使用凭证提供程序)。因此,我只能使用用户名&域。

此问题仅与Windows计算机有关。

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

我知道C#WindowsPrincipal类,如下所示:WindowsPrincipal

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

1 个答案:

答案 0 :(得分:0)

如果“几乎总是正确”足够好,您需要递归枚举用户的组成员身份,以查看您是否找到了Administrators组。这不是微不足道的,但这并非难以理解。没有内置库可供您使用。

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

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

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

根据需要,可能对于重新架构更为明智,因此在您已经获得用户密码之前,您无需做出此决定。