|
|
//-----------------------------------------------------------------------------
// checkuser.h
//-----------------------------------------------------------------------------
#ifndef _CHECKUSER_H
#define _CHECKUSER_H
HRESULT _CheckSIDInProcess( SID* pSID ) { if( !pSID ) { return E_POINTER; }
BOOL bRet = FALSE; if( !CheckTokenMembership(NULL, pSID, &bRet) ) { return HRESULT_FROM_WIN32( GetLastError() ); }
return bRet ? S_OK : S_FALSE; }
HRESULT IsUserInGroup( DWORD dwRID ) { PSID psid = NULL; SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY; BOOL bRet = AllocateAndInitializeSid( &sia, 2, SECURITY_BUILTIN_DOMAIN_RID, dwRID, 0, 0, 0, 0, 0, 0, &psid); if( !bRet ) { return HRESULT_FROM_WIN32( GetLastError() ); } else if( !psid ) { return E_FAIL; } HRESULT hr = _CheckSIDInProcess( (SID*)psid ); FreeSid( psid ); return hr; }
HRESULT IsUserInGroup( const TCHAR* pszGroup ) { if( !pszGroup ) { return E_POINTER; }
HRESULT hr = S_FALSE; DWORD dwSize = 0; DWORD dwDomainSize = 0; SID_NAME_USE snu; if( !LookupAccountName(NULL, pszGroup, NULL, &dwSize, NULL, &dwDomainSize, &snu) && GetLastError() == ERROR_INSUFFICIENT_BUFFER ) { SID* psid = (SID*)new BYTE[dwSize]; if( !psid ) { return E_OUTOFMEMORY; }
TCHAR* pszDomain = new TCHAR[dwDomainSize]; if( !pszDomain ) { delete[] psid; return E_OUTOFMEMORY; }
if( LookupAccountName(NULL, pszGroup, psid, &dwSize, pszDomain, &dwDomainSize, &snu) ) { hr = _CheckSIDInProcess( psid ); } else { hr = HRESULT_FROM_WIN32( GetLastError() ); }
delete[] psid; delete[] pszDomain; } else { return E_FAIL; }
return hr; }
#endif // _CHECKUSER_H
|