%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file dk4isadm.h Check whether process runs with admin privileges. */ #ifdef __cplusplus extern "C" { #endif /** Check whether the current process runs with administrative privileges. @return 1 if administrative, 0 if user process, -1 if failed to check. */ int dk4isadmin(void); #ifdef __cplusplus } #endif %% module #include "dk4conf.h" #if DK4_ON_WINDOWS #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED 1 #endif #endif #include "dk4types.h" #if DK4_HAVE_UNISTD_H #ifndef UNISTD_H_INCLUDED #include #define UNISTD_H_INCLUDED 1 #endif #endif #if DK4_HAVE_SYS_TYPES_H #ifndef SYS_TYPES_H_INCLUDED #include #define SYS_TYPES_H_INCLUDED 1 #endif #endif int dk4isadmin(void) { #if DK4_ON_WINDOWS PSID pAdmGroup = NULL; SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY; BOOL bres = FALSE; BOOL isadm = FALSE; #endif int back = 0; #if DK4_ON_WINDOWS back = -1; bres = AllocateAndInitializeSid( &ntAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, /* sub-authority 0 */ DOMAIN_ALIAS_RID_ADMINS, /* sub-authority 1 */ (DWORD)0, /* sub-authority 2 */ (DWORD)0, /* sub-authority 3 */ (DWORD)0, /* sub-authority 4 */ (DWORD)0, /* sub-authority 5 */ (DWORD)0, /* sub-authority 6 */ (DWORD)0, /* sub-authority 7 */ &pAdmGroup ); if (bres) { if (CheckTokenMembership(NULL, pAdmGroup, &isadm)) { if (isadm) { back = 1; } else { back = 0; } } } if (NULL != pAdmGroup) { FreeSid(pAdmGroup); } #else if (0 == geteuid()) { back = 1; } #endif return back; }