Win32OperatingSystem.st
changeset 15871 2cb35be4d68f
parent 15870 dc9e47f7ec47
child 15873 6871784b7a5b
--- 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 $'
 
 ! !