|
|
//+----------------------------------------------------------------------------
//
// File: MemberOfGroup.cpp
//
// Module: Common Code
//
// Synopsis: Implements the function IsMemberOfGroup (plus accessor functions).
//
// Copyright (c) 2002 Microsoft Corporation
//
// Author: SumitC Created 26-Jan-2002
//
//-----------------------------------------------------------------------------
//+----------------------------------------------------------------------------
//
// Function: IsMemberOfGroup
//
// Synopsis: This function return TRUE if the current user is a member of
// the passed and FALSE passed in Group RID.
//
// Arguments: DWORD dwGroupRID -- the RID of the group to check membership of
// BOOL bUseBuiltinDomainRid -- whether the SECURITY_BUILTIN_DOMAIN_RID
// RID should be used to build the Group
// SID
//
// Returns: BOOL - TRUE if the user is a member of the specified group
//
// History: quintinb Shamelessly stolen from MSDN 02/19/98
// quintinb Reworked and renamed 06/18/99
// to apply to more than just Admins
// quintinb Rewrote to use CheckTokenMemberShip 08/18/99
// since the MSDN method was no longer
// correct on NT5 -- 389229
// tomkel Taken from cmstp and modified for use 05/09/2001
// in cmdial
// sumitc Made common code 01/26/2002
//
//+----------------------------------------------------------------------------
BOOL IsMemberOfGroup(DWORD dwGroupRID, BOOL bUseBuiltinDomainRid) { PSID psidGroup = NULL; SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY; BOOL bSuccess = FALSE;
if (OS_NT5) { //
// Make a SID for the Group we are checking for, Note that we if we need the Built
// in Domain RID (for Groups like Administrators, PowerUsers, Users, etc)
// then we will have two entries to pass to AllocateAndInitializeSid. Otherwise,
// (for groups like Authenticated Users) we will only have one.
//
BYTE byNum; DWORD dwFirstRID; DWORD dwSecondRID;
if (bUseBuiltinDomainRid) { byNum = 2; dwFirstRID = SECURITY_BUILTIN_DOMAIN_RID; dwSecondRID = dwGroupRID; } else { byNum = 1; dwFirstRID = dwGroupRID; dwSecondRID = 0; }
if (AllocateAndInitializeSid(&siaNtAuthority, byNum, dwFirstRID, dwSecondRID, 0, 0, 0, 0, 0, 0, &psidGroup))
{ //
// Now we need to dynamically load the CheckTokenMemberShip API from
// advapi32.dll since it is a Win2k only API.
//
// some modules using this may have advapi32 loaded already...
HMODULE hAdvapi = GetModuleHandleA("advapi32.dll");
if (NULL == hAdvapi) { // ... if they don't, load it.
hAdvapi = LoadLibraryExA("advapi32.dll", NULL, 0); }
if (hAdvapi) { typedef BOOL (WINAPI *pfnCheckTokenMembershipSpec)(HANDLE, PSID, PBOOL); pfnCheckTokenMembershipSpec pfnCheckTokenMembership;
pfnCheckTokenMembership = (pfnCheckTokenMembershipSpec)GetProcAddress(hAdvapi, "CheckTokenMembership");
if (pfnCheckTokenMembership) { //
// Check to see if the user is actually a member of the group in question
//
if (!(pfnCheckTokenMembership)(NULL, psidGroup, &bSuccess)) { bSuccess = FALSE; CMASSERTMSG(FALSE, TEXT("CheckTokenMemberShip Failed.")); } } else { CMASSERTMSG(FALSE, TEXT("IsMemberOfGroup -- GetProcAddress failed for CheckTokenMemberShip")); } } else { CMASSERTMSG(FALSE, TEXT("IsMemberOfGroup -- Unable to get the module handle for advapi32.dll")); }
FreeSid (psidGroup);
if (hAdvapi) { FreeLibrary(hAdvapi); } } }
return bSuccess; }
//+----------------------------------------------------------------------------
//
// Function: IsAdmin
//
// Synopsis: Check to see if the user is a member of the Administrators group
// or not.
//
// Arguments: None
//
// Returns: BOOL - TRUE if the current user is an Administrator
//
// History: quintinb Created Header 8/18/99
// tomkel Taken from cmstp 05/09/2001
// sumitc Made common code 01/26/2002
//
//+----------------------------------------------------------------------------
BOOL IsAdmin(VOID) { return IsMemberOfGroup(DOMAIN_ALIAS_RID_ADMINS, TRUE); // TRUE == bUseBuiltinDomainRid
}
//+----------------------------------------------------------------------------
//
// Function: IsAuthenticatedUser
//
// Synopsis: Check to see if the current user is a member of the
// Authenticated Users group.
//
// Arguments: None
//
// Returns: BOOL - TRUE if the current user is a member of the
// Authenticated Users group.
//
// History: quintinb Created Header 8/18/99
// sumitc Made common code 01/26/2002
//
//+----------------------------------------------------------------------------
BOOL IsAuthenticatedUser(void) { return IsMemberOfGroup(SECURITY_AUTHENTICATED_USER_RID, FALSE); // FALSE == bUseBuiltinDomainRid
}
|