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

时间:2011-09-03 19:19:27

标签: c windows

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

代码段:

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 );
}

3 个答案:

答案 0 :(得分:2)

您需要执行以下步骤。

  1. 决定您要选择哪个登录用户,可能有多个。我会使用一个过程识别它们,例如探索者的过程。
  2. 调用OpenProcessToken()传递进程句柄。请务必指定TOKEN_DUPLICATE
  3. 致电DuplicateToken()以获取模拟令牌。
  4. 像以前一样调用CheckTokenMembership()但是传递令牌而不是NULL
  5. 整理!

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)