58 lines
2.3 KiB
C#
58 lines
2.3 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|