c - Sådan kontrolleres, om en bestemt bruger er administrator på en lokal computer eller ej?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne vide, om en bruger er administrator på en pc eller ej? Jeg fandt en kodestykke, hvilket gør dette, men jeg har et problem med det. Problemet med denne kode er, at denne funktion vil returnere, hvis brugeren, der startede processen, har administratorrettigheder eller ej. Men jeg vil gerne spørge, om en bestemt bruger har administratorrettigheder eller ej. Kan jeg gøre det på en eller anden måde? Dette er vigtigt, fordi min ansøgning kører under SYSTEM-konto, så det vil altid returnere, at brugeren er administrator, men jeg vil gerne vide, om den logget bruger er administrator eller ej?


Kode kode:


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

Bedste reference


Du skal tage følgende trin.



  1. Bestem hvilken logget bruger du vil vælge på, der kunne være mere end en. Jeg ville identificere dem ved hjælp af en proces, f.eks. explorer processen.

  2. Ring til OpenProcessToken() forbi proceshåndtaget. Sørg for at du angiver TOKEN\_DUPLICATE.

  3. Ring til DuplicateToken() for at få et personligt tilkendegivelsestegn.

  4. Ring til CheckTokenMembership() som før, men passerer symbolet i stedet for NULL.

  5. Ryd op!


Andre referencer 1



  1. Kør din brugergrænseflade inden for den logget brugerkonto. Dette beskytter den privilegerede service mod splitteangreb. [7] [8]

  2. Brug DCOM til at sende anmodninger fra GUI til den privilegerede tjeneste. Brug efterligning inden for den privilegerede tjeneste for at opdage brugerens rettigheder.


Andre referencer 2


Se på denne blogartikel på MSDN:


Sådan bestemmes det, om en tråd kører i brugerens kontekst af lokal administratorkonto [9]