确定当前用户帐户属于哪个组?
Determine which group(s) the current user account belongs to?
对于我在工作中编写的小型实用程序,我有以下代码来确定当前用户帐户是本地管理员还是域管理员:
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
这在我们的案例中有效,因为:
- 我们的域管理员帐户是内置的管理员帐户
- 我们没有任何其他域管理员帐户。
但是,我意识到这是一个糟糕的解决方案,因为将来我们可能会添加其他域管理员帐户。有没有一种方法可以使用 Windows API 来确定该进程来自 运行 的用户帐户是否属于 Domain Admins 组或 BUILTIN\Administrators
?
这不是安全问题,因为除非 运行 作为管理员,否则该应用实际上无法做任何有用的事情,这只是为了稳健性。
在这种情况下正确的解决方案是设置 /MANIFESTUAC:level=requireAdministrator
链接器选项,或者如果您已经有清单,请添加一个 requestedExecutionLevel
条目 as described here.
这样,Windows 将拒绝 运行 没有提升权限的程序,并且您无需在代码中执行任何操作。这也将使用户更容易,因为他们不必显式 运行 提升您的代码以使其工作; Windows 将在必要时提示他们。
但是,如果您真的想以编程方式进行,see the documentation for the CheckTokenMembership function甚至有示例代码可以完全满足您的要求。 :-)
对于我在工作中编写的小型实用程序,我有以下代码来确定当前用户帐户是本地管理员还是域管理员:
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
这在我们的案例中有效,因为:
- 我们的域管理员帐户是内置的管理员帐户
- 我们没有任何其他域管理员帐户。
但是,我意识到这是一个糟糕的解决方案,因为将来我们可能会添加其他域管理员帐户。有没有一种方法可以使用 Windows API 来确定该进程来自 运行 的用户帐户是否属于 Domain Admins 组或 BUILTIN\Administrators
?
这不是安全问题,因为除非 运行 作为管理员,否则该应用实际上无法做任何有用的事情,这只是为了稳健性。
在这种情况下正确的解决方案是设置 /MANIFESTUAC:level=requireAdministrator
链接器选项,或者如果您已经有清单,请添加一个 requestedExecutionLevel
条目 as described here.
这样,Windows 将拒绝 运行 没有提升权限的程序,并且您无需在代码中执行任何操作。这也将使用户更容易,因为他们不必显式 运行 提升您的代码以使其工作; Windows 将在必要时提示他们。
但是,如果您真的想以编程方式进行,see the documentation for the CheckTokenMembership function甚至有示例代码可以完全满足您的要求。 :-)