www.pudn.com > 44w.rar > Admin.cpp
#define WIN32_LEAN_AND_MEAN #include#include #include PSID DomainAdminSid() { // Get logon domain for user WKSTA_USER_INFO_1 * info = NULL; NET_API_STATUS status = NetWkstaUserGetInfo( NULL, 1, (BYTE **)&info ); if ( status != 0 ) return NULL; // Get domain SID BYTE DomainSid[ 1024 ] = { 0 }; DWORD DomainSidLen = sizeof DomainSid; TCHAR DomainName[ MAX_PATH ] = _T(""); DWORD DomainNameLen = MAX_PATH; SID_NAME_USE Use; if ( ! LookupAccountName( NULL, (TCHAR *)info->wkui1_logon_domain, DomainSid, &DomainSidLen, DomainName, &DomainNameLen, &Use ) ) return NULL; NetApiBufferFree( info ); // validate domain sid if ( Use != SidTypeDomain ) return NULL; if ( !IsValidSid( DomainSid ) ) return NULL; // Get size of sid DWORD SubAuthorityCount = *GetSidSubAuthorityCount( DomainSid ); // NT 4.0 adds an odd RID to the end: get rid of it if ( *GetSidSubAuthority( DomainSid, SubAuthorityCount - 1 ) == 0xFFFFFFFF ) --SubAuthorityCount; // allocate storage for new Sid. domain Sid + Rid PSID pSid = (PSID) new BYTE[ GetSidLengthRequired( (UCHAR)(SubAuthorityCount + 1)) ]; InitializeSid( pSid, GetSidIdentifierAuthority( DomainSid ), (UCHAR)(SubAuthorityCount+1) ); // copy existing subauthorities from account domain Sid into new Sid for ( DWORD i = 0; i < SubAuthorityCount; i++ ) { *GetSidSubAuthority( pSid, i ) = *GetSidSubAuthority( DomainSid, i ); } // append Rid to new Sid *GetSidSubAuthority( pSid, SubAuthorityCount ) = DOMAIN_GROUP_RID_ADMINS; if ( !IsValidSid( pSid ) ) return NULL; return pSid; } bool MemberOfGroup( PSID Sid ) { HANDLE hToken; if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken ) ) return false; DWORD cb = 0; GetTokenInformation( hToken, TokenGroups, 0, 0, &cb ); TOKEN_GROUPS * ptg = (TOKEN_GROUPS *) new BYTE[ cb ]; GetTokenInformation( hToken, TokenGroups, ptg, cb, &cb ); CloseHandle( hToken ); bool bIsAdmin = false; for ( DWORD i = 0; i < ptg->GroupCount; ++i ) { if ( !IsValidSid( ptg->Groups[i].Sid ) ) continue; if ( EqualSid( ptg->Groups[i].Sid, Sid ) ) { bIsAdmin = true; break; } } delete []ptg; return bIsAdmin; } bool IsDomainAdmin() { PSID sid = DomainAdminSid(); if ( sid == NULL ) return false; return MemberOfGroup( sid ); }