|
#include "Sdk.h"
#include "SecurityMgr.h"
static
BOOL
NDAPI
FSecurityMgr_IsUserAdmin(
SecurityMgr *This,
BOOL *Result
) {
BOOL fResult = TRUE;
BYTE AdminSID[SECURITY_MAX_SID_SIZE] = {0};
DWORD cbSidLen = sizeof(AdminSID);
BOOL fIsMember = FALSE;
OSVERSIONINFOW osvi = {0};
HANDLE hProcess = NULL;
HANDLE hProcessToken = NULL;
HANDLE hLinkedToken = NULL;
DWORD cbTokenInfoLength = 0;
__try {
if(Result == NULL) {
__leave;
}
*Result = FALSE;
if(!CreateWellKnownSid(WinBuiltinAdministratorsSid,
NULL,
&AdminSID,
&cbSidLen
)) {
__leave;
}
if(!CheckTokenMembership(NULL,
AdminSID,
&fIsMember
)) {
__leave;
}
if(fIsMember) {
*Result = TRUE;
__leave;
}
osvi.dwOSVersionInfoSize = sizeof(osvi);
if(!GetVersionExW(&osvi)) {
__leave;
}
if(osvi.dwMajorVersion < 6) {
__leave;
}
hProcess = GetCurrentProcess();
if(!OpenProcessToken(hProcess,
TOKEN_QUERY,
&hProcessToken
)) {
__leave;
}
if(!GetTokenInformation(hProcessToken,
TokenLinkedToken,
(VOID*)&hLinkedToken,
sizeof(HANDLE),
&cbTokenInfoLength
)) {
__leave;
}
if(!CheckTokenMembership(hLinkedToken,
&AdminSID,
&fIsMember
)) {
__leave;
}
*Result = fIsMember;
fResult = TRUE;
}
__finally {
if(hLinkedToken != NULL) {
CloseHandle(hLinkedToken);
hLinkedToken = NULL;
}
if(hProcessToken != NULL) {
CloseHandle(hProcessToken);
hProcessToken = NULL;
}
if(hProcess) {
hProcess = NULL;
}
}
return fResult;
UNREFERENCED_PARAMETER(This);
}
static
struct SecurityMgrVtbl
__SecurityMgrVtbl = {
&FSecurityMgr_IsUserAdmin
};
static
struct SecurityMgr
__SecurityMgr = {
&__SecurityMgrVtbl
};
SecurityMgr*
SecurityMgr_GetObject(
VOID
) {
return &__SecurityMgr;
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.