using System.ComponentModel; using System.Security; using System.Security.Permissions; using System.Security.Principal; using Microsoft.Win32; using Microsoft.Win32.SafeHandles; namespace System { internal static class EnvironmentHelpers { private static volatile bool s_IsAppContainerProcess; private static volatile bool s_IsAppContainerProcessInitalized; public static bool IsAppContainerProcess { get { if(!s_IsAppContainerProcessInitalized) { if(Environment.OSVersion.Platform != PlatformID.Win32NT) { s_IsAppContainerProcess = false; } else if(Environment.OSVersion.Version.Major < 6 || (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor <= 1)) { // Windows 7 or older. s_IsAppContainerProcess = false; } else { s_IsAppContainerProcess = HasAppContainerToken(); } s_IsAppContainerProcessInitalized = true; } return s_IsAppContainerProcess; } } [SecuritySafeCritical] [SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.UnmanagedCode | SecurityPermissionFlag.ControlPrincipal)] private static unsafe bool HasAppContainerToken() { int* dwIsAppContainerPtr = stackalloc int[1]; uint dwLength = 0; using (WindowsIdentity wi = WindowsIdentity.GetCurrent(TokenAccessLevels.Query)) { if (!UnsafeNativeMethods.GetTokenInformation(wi.Token, UnsafeNativeMethods.TokenIsAppContainer, new IntPtr(dwIsAppContainerPtr), sizeof(int), out dwLength)) { throw new Win32Exception(); } } return (*dwIsAppContainerPtr != 0); } internal static bool IsWindowsVistaOrAbove() { // Method should match the logic of the internal Environment.IsWindowsVista property in mscorlib // If this method turns out to be heavily used we might want to cache at least part of this value. OperatingSystem os = Environment.OSVersion; return os.Platform == PlatformID.Win32NT && os.Version.Major >= 6; } } }