确定当前用户帐户属于哪个组?
问题描述:
对于一个小工具,应用程序,我在工作中写,我有以下的代码,以确定当前用户帐户是本地或域管理员:确定当前用户帐户属于哪个组?
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
这个权利现在在我们的情况,因为:
- 我们的域管理员帐户是内置的Administrator帐户
- 我们没有任何其他域管理员帐户。
但是,我意识到这是一个糟糕的解决方案,因为将来我们可能会添加其他域管理员帐户。有没有一种方法可以确定使用Windows API,该进程所运行的用户帐户是否属于Domain Admins组或BUILTIN\Administrators
,或者不是?
这不是一个安全问题,因为除非应用程序以管理员身份运行,否则该应用程序实际上无法执行任何有用的操作,这仅仅是为了提高可靠性。
答
在这种情况下,正确的解决方案是设置/MANIFESTUAC:level=requireAdministrator
链接器选项,或者如果您已经有清单,请添加requestedExecutionLevel
条目as described here。
这样,Windows将拒绝在没有提升特权的情况下运行该程序,并且您不需要在代码中执行任何操作。这也将使用户更容易,因为他们不必显式运行提升的代码以使其工作; Windows会根据需要提示他们。
但是,如果你真的想要以编程方式执行,see the documentation for the CheckTokenMembership function,它甚至有示例代码,完全符合你的要求。 :-)
在这种情况下,正确的解决方案是使用'/ MANIFESTUAC:level = requireAdministrator'链接器选项,或者如果您已经有一个清单,请添加一个'requestedExecutionLevel'条目,其中'level =“requireAdministrator”'[如此处所述](https://www.codeproject.com/articles/17968/making-your-application-uac-aware)。 –
如果因为某些其他原因需要检索组信息,请参阅http://*.com/questions/10450998/need-to-retrieve-all-groups-a-user-belongs-to-in-c。但在这种情况下,我同意@HarryJohnston。 – gnud