diff -r dc9e47f7ec47 -r 2cb35be4d68f Win32OperatingSystem.st --- a/Win32OperatingSystem.st Tue Dec 17 15:38:03 2013 +0100 +++ b/Win32OperatingSystem.st Tue Dec 17 16:10:33 2013 +0100 @@ -454,6 +454,53 @@ #define _HANDLEVal(o) (HANDLE)(__externalAddressVal(o)) #define _SETHANDLEVal(o, v) (__externalAddressVal(o) = (v)) +#if defined(__BORLANDC__) + +typedef enum _TOKEN_ELEVATION_TYPE { + TokenElevationTypeDefault = 1, + TokenElevationTypeFull, + TokenElevationTypeLimited, +} TOKEN_ELEVATION_TYPE, *PTOKEN_ELEVATION_TYPE; + +typedef struct _TOKEN_ELEVATION { + DWORD TokenIsElevated; +} TOKEN_ELEVATION, *PTOKEN_ELEVATION; + +typedef enum _TOKEN_INFORMATION_CLASS_V2 { + nTokenUser = 1, + nTokenGroups, + nTokenPrivileges, + nTokenOwner, + nTokenPrimaryGroup, + nTokenDefaultDacl, + nTokenSource, + nTokenType, + nTokenImpersonationLevel, + nTokenStatistics, + nTokenRestrictedSids, + nTokenSessionId, + nTokenGroupsAndPrivileges, + nTokenSessionReference, + nTokenSandBoxInert, + nTokenAuditPolicy, + nTokenOrigin, + nTokenElevationType, + nTokenLinkedToken, + nTokenElevation, + nTokenHasRestrictions, + nTokenAccessInformation, + nTokenVirtualizationAllowed, + nTokenVirtualizationEnabled, + nTokenIntegrityLevel, + nTokenUIAccess, + nTokenMandatoryPolicy, + nTokenLogonSid, + nMaxTokenInfoClass // MaxTokenInfoClass should always be the last enum +} TOKEN_INFORMATION_CLASS_V2, *PTOKEN_INFORMATION_CLASS_V2; +# define TokenElevationType (TOKEN_INFORMATION_CLASS)nTokenElevationType +# define TokenElevation (TOKEN_INFORMATION_CLASS)nTokenElevation +#endif + %} ! ! @@ -10829,19 +10876,44 @@ isRunningWithElevatedAdminRights "return true, if a NORMAL user is running with elevated admin rights." - ^ self currentUserHasAdminRights not - and:[ self isRunningWithRootOrAdminRights ] -%} -! - -currentUserHasAdminRights - "return true, if the current user has admin rights" -%{ - WindowsIdentity identity = WindowsIdentity.GetCurrent(); - WindowsPrincipal principal = new WindowsPrincipal(identity); - RETURN ( principal.IsInRole (WindowsBuiltInRole.Administrator) - ? true : false ); -%} +%{ + + HANDLE h_Process; + HANDLE h_Token; + TOKEN_ELEVATION t_TokenElevation; + TOKEN_ELEVATION_TYPE e_ElevationType; + DWORD dw_TokenLength; + + h_Process = GetCurrentProcess(); + if (OpenProcessToken(h_Process,TOKEN_READ,&h_Token) == FALSE) { + printf("Error: Couldn't open the process token\n"); + goto getOutOfHere; + } + if (GetTokenInformation(h_Token,TokenElevation,&t_TokenElevation,sizeof(t_TokenElevation),&dw_TokenLength) == FALSE) { + printf("Error: Couldn't retrieve the elevation right of the current process token\n"); + CloseHandle(h_Token); + goto getOutOfHere; + } + if (t_TokenElevation.TokenIsElevated != 0) { + if (GetTokenInformation(h_Token,TokenElevationType,&e_ElevationType,sizeof(e_ElevationType),&dw_TokenLength) == FALSE) { + printf("Error: Couldn't retrieve the elevation token class\n"); + CloseHandle(h_Token); + goto getOutOfHere; + } else { + if (e_ElevationType == TokenElevationTypeFull || e_ElevationType == TokenElevationTypeDefault) { + CloseHandle(h_Token); + RETURN(true); + } + CloseHandle(h_Token); + RETURN(false); + } + } else { + CloseHandle(h_Token); + RETURN(false); + } +getOutOfHere: ; +%}. + self primitiveFailed. ! userInfoOf:aNameOrID @@ -17412,15 +17484,15 @@ !Win32OperatingSystem class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.484 2013-12-17 14:38:03 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.485 2013-12-17 15:10:33 cg Exp $' ! version_CVS - ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.484 2013-12-17 14:38:03 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.485 2013-12-17 15:10:33 cg Exp $' ! version_SVN - ^ '$Id: Win32OperatingSystem.st,v 1.484 2013-12-17 14:38:03 cg Exp $' + ^ '$Id: Win32OperatingSystem.st,v 1.485 2013-12-17 15:10:33 cg Exp $' ! !