【问题标题】:Determine which group(s) the current user account belongs to?确定当前用户帐户属于哪个组?
【发布时间】:2016-12-05 20:10:48
【问题描述】:

对于我在工作中编写的一个小型实用程序应用程序,我有以下代码来确定当前用户帐户是本地管理员还是域管理员:

    WCHAR wszUser[UNLEN];

    GetEnvironmentVariableW(L"username", wszUser, UNLEN);

#ifndef _DEBUG
    if (StrCmpIW(wszUser, L"Administrator") != 0)
    {
        MessageBoxW(0, L"This program can only be run as Administrator.", L"Error", MB_OK | MB_ICONSTOP);
        return 0;
    }
#endif

这适用于我们的案例,因为:

  1. 我们拥有的域管理员帐户是内置管理员帐户
  2. 我们没有任何其他域管理员帐户。

但是,我意识到这是一个糟糕的解决方案,因为将来我们可能会添加其他域管理员帐户。有没有办法使用 Windows API 确定运行进程的用户帐户是否属于 Domain Admins 组或BUILTIN\Administrators

这不是安全问题,因为除非以管理员身份运行,否则该应用实际上无法执行任何有用的操作,这只是为了稳健性。

【问题讨论】:

  • 在这种情况下,正确的解决方案是使用/MANIFESTUAC:level=requireAdministrator 链接器选项,或者如果您已经有一个清单,添加一个带有level="requireAdministrator" as described hererequestedExecutionLevel 条目。
  • 如果您出于其他原因需要检索组信息,请查看stackoverflow.com/questions/10450998/…。但在这种情况下,我同意@HarryJohnston。

标签: c winapi user-accounts usergroups


【解决方案1】:

在这种情况下正确的解决方案是设置/MANIFESTUAC:level=requireAdministrator链接器选项,或者如果您已经有一个清单,添加一个requestedExecutionLevel条目as described here

这样,Windows 将拒绝在没有提升权限的情况下运行程序,并且您无需在代码中执行任何操作。这也将使用户更容易,因为他们不必显式运行提升的代码以使其工作; Windows 将根据需要提示它们。

但是,如果您真的想以编程方式执行此操作,see the documentation for the CheckTokenMembership function,它甚至包含完全符合您要求的示例代码。 :-)

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2015-12-30
    • 2023-04-05
    • 2022-06-14
    相关资源
    最近更新 更多