c - 确定当前用户帐户属于哪个组?

标签 c winapi user-accounts usergroups

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

    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 链接器选项,或者如果您已经有一个 list ,请添加一个 requestedExecutionLevel 条目 as described here

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

但是,如果您真的想以编程方式进行,see the documentation for the CheckTokenMembership function 甚至有示例代码可以完全满足您的要求。 :-)

关于c - 确定当前用户帐户属于哪个组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40982495/

相关文章:

c# - CreateFile 方法中的 dwFlagsAndAttributes = 0 是什么意思?

c - getenv ("APPDATA") 如果当前用户的用户名包含 unicode 字符,则返回不正确的值

基于Java的用户认证

c++ - 如何使用 WSASend() 和 IOCP 模拟阻塞 send()?

c - 这个&符号在C中是什么意思?

c - 为什么在反向函数中它可以正常工作而不使用 for 循环来处理下一个字符,例如 ( sPtr[ count]( sPtr[ 2],if ( sPtr[ 3]...... 等等)

c++ - 如何使用visual studio在c中捕获全屏

linux - user_id 和 group_id 始终从唯一值开始

c# - 如何获取本地 Windows 用户列表(仅限出现在 Windows 登录屏幕中的用户)

c++ - 从选项卡控件项获取文本失败