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

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

问题描述:

对于一个小工具,应用程序,我在工作中写,我有以下的代码,以确定当前用户帐户是本地或域管理员:确定当前用户帐户属于哪个组?

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. 我们的域管理员帐户是内置的Administrator帐户
  2. 我们没有任何其他域管理员帐户。

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

这不是一个安全问题,因为除非应用程序以管理员身份运行,否则该应用程序实际上无法执行任何有用的操作,这仅仅是为了提高可靠性。

+2

在这种情况下,正确的解决方案是使用'/ MANIFESTUAC:level = requireAdministrator'链接器选项,或者如果您已经有一个清单,请添加一个'requestedExecutionLevel'条目,其中'level =“requireAdministrator”'[如此处所述](https://www.codeproject.com/articles/17968/making-your-application-uac-aware)。 –

+1

如果因为某些其他原因需要检索组信息,请参阅http://*.com/questions/10450998/need-to-retrieve-all-groups-a-user-belongs-to-in-c。但在这种情况下,我同意@HarryJohnston。 – gnud

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

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

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