--- 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 $'
! !