C 如何检查指定用户是否是本地计算机上的管理员?

C 如何检查指定用户是否是本地计算机上的管理员?,c,windows,C,Windows,我想知道,用户是否是PC上的管理员?我发现了一个代码片段,它可以做到这一点,但我有一个问题。此代码的问题是,如果启动该进程的用户是否具有管理员权限,则此函数将返回。但我想查询特定用户是否具有管理员权限。我可以这样做吗?这很重要,因为我的应用程序将在系统帐户下运行,因此它将始终返回用户是admin,但我想知道登录的用户是否是admin 代码段: BOOL IsUserAdmin( VOID ) /*++ Routine Description: This routine returns TRUE

我想知道,用户是否是PC上的管理员?我发现了一个代码片段,它可以做到这一点,但我有一个问题。此代码的问题是,如果启动该进程的用户是否具有管理员权限,则此函数将返回。但我想查询特定用户是否具有管理员权限。我可以这样做吗?这很重要,因为我的应用程序将在系统帐户下运行,因此它将始终返回用户是admin,但我想知道登录的用户是否是admin

代码段:

BOOL IsUserAdmin( VOID )
/*++ 
Routine Description: This routine returns TRUE if the caller's
process is a member of the Administrators local group. Caller is NOT
expected to be impersonating anyone and is expected to be able to
open its own process and process token. 
Arguments: None. 
Return Value: 
  TRUE - Caller has Administrators local group. 
  FALSE - Caller does not have Administrators local group. --
*/ 
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup; 

b = AllocateAndInitializeSid(
                                &NtAuthority,
                                2,
                                SECURITY_BUILTIN_DOMAIN_RID,
                                DOMAIN_ALIAS_RID_ADMINS,
                                0, 0, 0, 0, 0, 0,
                                &AdministratorsGroup
                            ); 
if ( b ) 
{
    if ( !CheckTokenMembership( NULL, AdministratorsGroup, &b ) ) 
    {
        b = FALSE;
    } 
    FreeSid( AdministratorsGroup ); 
}

return ( b );
}

您需要采取以下步骤

  • 决定要选择哪个登录用户,可能有多个。我会使用一个进程来识别它们,例如explorer进程
  • 调用传递进程句柄。确保指定
    标记\u DUPLICATE
  • 调用以获取模拟令牌
  • 像以前一样调用
    CheckTokenMembership()
    ,但传递令牌而不是
    NULL
  • 收拾一下
    请看这篇关于MSDN的博客文章:

  • 在登录的用户帐户中运行用户界面。这可以保护特权服务免受破坏攻击

  • 使用DCOM将请求从GUI转发到特权服务。在特权服务中使用模拟来发现用户的权限


  • 哪个登录用户?可能有很多。不要使用系统帐户。这是2011年。在我的公司,一次只有一个登录用户:)为什么不使用系统帐户?这有点复杂,但有一个调度任务将调用.bat文件,并运行其中的每个应用程序。计划的任务运行在系统帐户下。您不应该在系统帐户下运行。它太强大了。坏习惯。不要运行特权服务。@David:通常需要某种级别的特权,尽管它可能不应该是“系统”,这取决于应用程序的详细信息。通常不赞成只使用链接的答案,因为链接会随着时间的推移而断开,从而使答案无效。至少,你应该总结一下链接所解释的内容,因此,如果链接确实中断,一些有用的信息仍然可用。