diff --git a/SystemExtensions.sln b/SystemExtensions.sln
index 3bafb54..ecd46ce 100644
--- a/SystemExtensions.sln
+++ b/SystemExtensions.sln
@@ -1,11 +1,14 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.28307.572
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30309.148
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemExtensions", "SystemExtensions\SystemExtensions.csproj", "{55850FF3-70E4-4828-BEEE-39837AC0D24C}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemExtensionsTests", "SystemExtensionsTests\SystemExtensionsTests.csproj", "{F9B61261-0A08-4B53-BAEA-44E05DBBBFE5}"
+ ProjectSection(ProjectDependencies) = postProject
+ {8549FC12-B0BF-4957-A5DB-CE9A17955589} = {8549FC12-B0BF-4957-A5DB-CE9A17955589}
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SystemExtensions", "SystemExtensions\SystemExtensions.csproj", "{8549FC12-B0BF-4957-A5DB-CE9A17955589}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -13,14 +16,14 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {55850FF3-70E4-4828-BEEE-39837AC0D24C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {55850FF3-70E4-4828-BEEE-39837AC0D24C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {55850FF3-70E4-4828-BEEE-39837AC0D24C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {55850FF3-70E4-4828-BEEE-39837AC0D24C}.Release|Any CPU.Build.0 = Release|Any CPU
{F9B61261-0A08-4B53-BAEA-44E05DBBBFE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F9B61261-0A08-4B53-BAEA-44E05DBBBFE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F9B61261-0A08-4B53-BAEA-44E05DBBBFE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F9B61261-0A08-4B53-BAEA-44E05DBBBFE5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8549FC12-B0BF-4957-A5DB-CE9A17955589}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8549FC12-B0BF-4957-A5DB-CE9A17955589}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8549FC12-B0BF-4957-A5DB-CE9A17955589}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8549FC12-B0BF-4957-A5DB-CE9A17955589}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/SystemExtensions/Properties/AssemblyInfo.cs b/SystemExtensions/Properties/AssemblyInfo.cs
deleted file mode 100644
index 493de4d..0000000
--- a/SystemExtensions/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Reflection;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("SystemExtensions")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("SystemExtensions")]
-[assembly: AssemblyCopyright("Copyright © 2019")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("55850ff3-70e4-4828-beee-39837ac0d24c")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/SystemExtensions/Security/ProcessInformation.cs b/SystemExtensions/Security/ProcessInformation.cs
deleted file mode 100644
index 1c49ea3..0000000
--- a/SystemExtensions/Security/ProcessInformation.cs
+++ /dev/null
@@ -1,793 +0,0 @@
-using Microsoft.Win32.SafeHandles;
-using System;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Security.Principal;
-using System.Text.RegularExpressions;
-
-namespace SystemExtensions.Security
-{
- ///
- /// Helper class to obtain admin privileges and elevation status.
- ///
- /// Source code provided on https://code.msdn.microsoft.com/windowsapps/CSUACSelfElevation-644673d3
- public static class ProcessInformation
- {
- ///
- /// The function checks whether the primary access token of the process belongs
- /// to user account that is a member of the local Administrators group, even if
- /// it currently is not elevated.
- ///
- ///
- /// Returns true if the primary access token of the process belongs to user
- /// account that is a member of the local Administrators group. Returns false
- /// if the token does not.
- ///
- ///
- /// When any native Windows API call fails, the function throws a Win32Exception
- /// with the last error code.
- ///
- public static bool IsUserInAdminGroup()
- {
- bool fInAdminGroup = false;
- SafeTokenHandle hToken = null;
- SafeTokenHandle hTokenToCheck = null;
- IntPtr pElevationType = IntPtr.Zero;
- IntPtr pLinkedToken = IntPtr.Zero;
- int cbSize = 0;
-
- try
- {
- // Open the access token of the current process for query and duplicate.
- if (!NativeMethods.OpenProcessToken(Process.GetCurrentProcess().Handle,
- NativeMethods.TOKEN_QUERY | NativeMethods.TOKEN_DUPLICATE, out hToken))
- {
- throw new Win32Exception();
- }
-
- // Determine whether system is running Windows Vista or later operating
- // systems (major version >= 6) because they support linked tokens, but
- // previous versions (major version < 6) do not.
- if (Environment.OSVersion.Version.Major >= 6)
- {
- // Running Windows Vista or later (major version >= 6).
- // Determine token type: limited, elevated, or default.
-
- // Allocate a buffer for the elevation type information.
- cbSize = sizeof(TOKEN_ELEVATION_TYPE);
- pElevationType = Marshal.AllocHGlobal(cbSize);
- if (pElevationType == IntPtr.Zero)
- {
- throw new Win32Exception();
- }
-
- // Retrieve token elevation type information.
- if (!NativeMethods.GetTokenInformation(hToken,
- TOKEN_INFORMATION_CLASS.TokenElevationType, pElevationType,
- cbSize, out cbSize))
- {
- throw new Win32Exception();
- }
-
- // Marshal the TOKEN_ELEVATION_TYPE enum from native to .NET.
- TOKEN_ELEVATION_TYPE elevType = (TOKEN_ELEVATION_TYPE)
- Marshal.ReadInt32(pElevationType);
-
- // If limited, get the linked elevated token for further check.
- if (elevType == TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited)
- {
- // Allocate a buffer for the linked token.
- cbSize = IntPtr.Size;
- pLinkedToken = Marshal.AllocHGlobal(cbSize);
- if (pLinkedToken == IntPtr.Zero)
- {
- throw new Win32Exception();
- }
-
- // Get the linked token.
- if (!NativeMethods.GetTokenInformation(hToken,
- TOKEN_INFORMATION_CLASS.TokenLinkedToken, pLinkedToken,
- cbSize, out cbSize))
- {
- throw new Win32Exception();
- }
-
- // Marshal the linked token value from native to .NET.
- IntPtr hLinkedToken = Marshal.ReadIntPtr(pLinkedToken);
- hTokenToCheck = new SafeTokenHandle(hLinkedToken);
- }
- }
-
- // CheckTokenMembership requires an impersonation token. If we just got
- // a linked token, it already is an impersonation token. If we did not
- // get a linked token, duplicate the original into an impersonation
- // token for CheckTokenMembership.
- if (hTokenToCheck == null)
- {
- if (!NativeMethods.DuplicateToken(hToken,
- SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
- out hTokenToCheck))
- {
- throw new Win32Exception();
- }
- }
-
- // Check if the token to be checked contains admin SID.
- WindowsIdentity id = new WindowsIdentity(hTokenToCheck.DangerousGetHandle());
- WindowsPrincipal principal = new WindowsPrincipal(id);
- fInAdminGroup = principal.IsInRole(WindowsBuiltInRole.Administrator);
- }
- finally
- {
- // Centralized cleanup for all allocated resources.
- if (hToken != null)
- {
- hToken.Close();
- hToken = null;
- }
- if (hTokenToCheck != null)
- {
- hTokenToCheck.Close();
- hTokenToCheck = null;
- }
- if (pElevationType != IntPtr.Zero)
- {
- Marshal.FreeHGlobal(pElevationType);
- pElevationType = IntPtr.Zero;
- }
- if (pLinkedToken != IntPtr.Zero)
- {
- Marshal.FreeHGlobal(pLinkedToken);
- pLinkedToken = IntPtr.Zero;
- }
- }
-
- return fInAdminGroup;
- }
-
-
- ///
- /// The function checks whether the current process is run as administrator.
- /// In other words, it dictates whether the primary access token of the
- /// process belongs to user account that is a member of the local
- /// Administrators group and it is elevated.
- ///
- ///
- /// Returns true if the primary access token of the process belongs to user
- /// account that is a member of the local Administrators group and it is
- /// elevated. Returns false if the token does not.
- ///
- public static bool IsRunAsAdmin()
- {
- WindowsIdentity id = WindowsIdentity.GetCurrent();
- WindowsPrincipal principal = new WindowsPrincipal(id);
- return principal.IsInRole(WindowsBuiltInRole.Administrator);
- }
-
-
- ///
- /// The function gets the elevation information of the current process. It
- /// dictates whether the process is elevated or not. Token elevation is only
- /// available on Windows Vista and newer operating systems, thus
- /// IsProcessElevated throws a C++ exception if it is called on systems prior
- /// to Windows Vista. It is not appropriate to use this function to determine
- /// whether a process is run as administartor.
- ///
- ///
- /// Returns true if the process is elevated. Returns false if it is not.
- ///
- ///
- /// When any native Windows API call fails, the function throws a Win32Exception
- /// with the last error code.
- ///
- ///
- /// TOKEN_INFORMATION_CLASS provides TokenElevationType to check the elevation
- /// type (TokenElevationTypeDefault / TokenElevationTypeLimited /
- /// TokenElevationTypeFull) of the process. It is different from TokenElevation
- /// in that, when UAC is turned off, elevation type always returns
- /// TokenElevationTypeDefault even though the process is elevated (Integrity
- /// Level == High). In other words, it is not safe to say if the process is
- /// elevated based on elevation type. Instead, we should use TokenElevation.
- ///
- public static bool IsProcessElevated()
- {
- bool fIsElevated = false;
- SafeTokenHandle hToken = null;
- int cbTokenElevation = 0;
- IntPtr pTokenElevation = IntPtr.Zero;
-
- try
- {
- // Open the access token of the current process with TOKEN_QUERY.
- if (!NativeMethods.OpenProcessToken(Process.GetCurrentProcess().Handle,
- NativeMethods.TOKEN_QUERY, out hToken))
- {
- throw new Win32Exception();
- }
-
- // Allocate a buffer for the elevation information.
- cbTokenElevation = Marshal.SizeOf(typeof(TOKEN_ELEVATION));
- pTokenElevation = Marshal.AllocHGlobal(cbTokenElevation);
- if (pTokenElevation == IntPtr.Zero)
- {
- throw new Win32Exception();
- }
-
- // Retrieve token elevation information.
- if (!NativeMethods.GetTokenInformation(hToken,
- TOKEN_INFORMATION_CLASS.TokenElevation, pTokenElevation,
- cbTokenElevation, out cbTokenElevation))
- {
- // When the process is run on operating systems prior to Windows
- // Vista, GetTokenInformation returns false with the error code
- // ERROR_INVALID_PARAMETER because TokenElevation is not supported
- // on those operating systems.
- throw new Win32Exception();
- }
-
- // Marshal the TOKEN_ELEVATION struct from native to .NET object.
- TOKEN_ELEVATION elevation = (TOKEN_ELEVATION)Marshal.PtrToStructure(
- pTokenElevation, typeof(TOKEN_ELEVATION));
-
- // TOKEN_ELEVATION.TokenIsElevated is a non-zero value if the token
- // has elevated privileges; otherwise, a zero value.
- fIsElevated = (elevation.TokenIsElevated != 0);
- }
- finally
- {
- // Centralized cleanup for all allocated resources.
- if (hToken != null)
- {
- hToken.Close();
- hToken = null;
- }
- if (pTokenElevation != IntPtr.Zero)
- {
- Marshal.FreeHGlobal(pTokenElevation);
- pTokenElevation = IntPtr.Zero;
- cbTokenElevation = 0;
- }
- }
-
- return fIsElevated;
- }
-
-
- ///
- /// The function gets the integrity level of the current process. Integrity
- /// level is only available on Windows Vista and newer operating systems, thus
- /// GetProcessIntegrityLevel throws a C++ exception if it is called on systems
- /// prior to Windows Vista.
- ///
- ///
- /// Returns the integrity level of the current process. It is usually one of
- /// these values:
- ///
- /// SECURITY_MANDATORY_UNTRUSTED_RID - means untrusted level. It is used
- /// by processes started by the Anonymous group. Blocks most write access.
- /// (SID: S-1-16-0x0)
- ///
- /// SECURITY_MANDATORY_LOW_RID - means low integrity level. It is used by
- /// Protected Mode Internet Explorer. Blocks write acess to most objects
- /// (such as files and registry keys) on the system. (SID: S-1-16-0x1000)
- ///
- /// SECURITY_MANDATORY_MEDIUM_RID - means medium integrity level. It is
- /// used by normal applications being launched while UAC is enabled.
- /// (SID: S-1-16-0x2000)
- ///
- /// SECURITY_MANDATORY_HIGH_RID - means high integrity level. It is used
- /// by administrative applications launched through elevation when UAC is
- /// enabled, or normal applications if UAC is disabled and the user is an
- /// administrator. (SID: S-1-16-0x3000)
- ///
- /// SECURITY_MANDATORY_SYSTEM_RID - means system integrity level. It is
- /// used by services and other system-level applications (such as Wininit,
- /// Winlogon, Smss, etc.) (SID: S-1-16-0x4000)
- ///
- ///
- ///
- /// When any native Windows API call fails, the function throws a Win32Exception
- /// with the last error code.
- ///
- public static int GetProcessIntegrityLevel()
- {
- int IL = -1;
- SafeTokenHandle hToken = null;
- int cbTokenIL = 0;
- IntPtr pTokenIL = IntPtr.Zero;
-
- try
- {
- // Open the access token of the current process with TOKEN_QUERY.
- if (!NativeMethods.OpenProcessToken(Process.GetCurrentProcess().Handle,
- NativeMethods.TOKEN_QUERY, out hToken))
- {
- throw new Win32Exception();
- }
-
- // Then we must query the size of the integrity level information
- // associated with the token. Note that we expect GetTokenInformation
- // to return false with the ERROR_INSUFFICIENT_BUFFER error code
- // because we've given it a null buffer. On exit cbTokenIL will tell
- // the size of the group information.
- if (!NativeMethods.GetTokenInformation(hToken,
- TOKEN_INFORMATION_CLASS.TokenIntegrityLevel, IntPtr.Zero, 0,
- out cbTokenIL))
- {
- int error = Marshal.GetLastWin32Error();
- if (error != NativeMethods.ERROR_INSUFFICIENT_BUFFER)
- {
- // When the process is run on operating systems prior to
- // Windows Vista, GetTokenInformation returns false with the
- // ERROR_INVALID_PARAMETER error code because
- // TokenIntegrityLevel is not supported on those OS's.
- throw new Win32Exception(error);
- }
- }
-
- // Now we allocate a buffer for the integrity level information.
- pTokenIL = Marshal.AllocHGlobal(cbTokenIL);
- if (pTokenIL == IntPtr.Zero)
- {
- throw new Win32Exception();
- }
-
- // Now we ask for the integrity level information again. This may fail
- // if an administrator has added this account to an additional group
- // between our first call to GetTokenInformation and this one.
- if (!NativeMethods.GetTokenInformation(hToken,
- TOKEN_INFORMATION_CLASS.TokenIntegrityLevel, pTokenIL, cbTokenIL,
- out cbTokenIL))
- {
- throw new Win32Exception();
- }
-
- // Marshal the TOKEN_MANDATORY_LABEL struct from native to .NET object.
- TOKEN_MANDATORY_LABEL tokenIL = (TOKEN_MANDATORY_LABEL)
- Marshal.PtrToStructure(pTokenIL, typeof(TOKEN_MANDATORY_LABEL));
-
- // Integrity Level SIDs are in the form of S-1-16-0xXXXX. (e.g.
- // S-1-16-0x1000 stands for low integrity level SID). There is one
- // and only one subauthority.
- IntPtr pIL = NativeMethods.GetSidSubAuthority(tokenIL.Label.Sid, 0);
- IL = Marshal.ReadInt32(pIL);
- }
- finally
- {
- // Centralized cleanup for all allocated resources.
- if (hToken != null)
- {
- hToken.Close();
- hToken = null;
- }
- if (pTokenIL != IntPtr.Zero)
- {
- Marshal.FreeHGlobal(pTokenIL);
- pTokenIL = IntPtr.Zero;
- cbTokenIL = 0;
- }
- }
-
- return IL;
- }
-
- ///
- /// Elevate process to administration rights.
- ///
- /// True if the elevation succeeded or false if it failed.
- public static bool ElevateProcess()
- {
- if (!IsRunAsAdmin())
- {
- // Launch itself as administrator
- ProcessStartInfo proc = new ProcessStartInfo();
- proc.UseShellExecute = true;
- proc.WorkingDirectory = Environment.CurrentDirectory;
- proc.FileName = Process.GetCurrentProcess().MainModule.FileName;
- proc.Verb = "runas";
-
-
- try
- {
- Process.Start(proc);
- Process.GetCurrentProcess().Close(); // Quit itself
- return true;
- }
- catch
- {
- // The user refused the elevation.
- // Do nothing and return directly ...
- return false;
- }
- }
- else
- {
- return true;
- }
- }
-
- ///
- /// Gets the application path of the running assembly.
- ///
- /// String containing the path to the executing assembly.
- public static string GetApplicationPath()
- {
- var exePath = Path.GetDirectoryName(System.Reflection
- .Assembly.GetExecutingAssembly().CodeBase);
- Regex appPathMatcher = new Regex(@"(?
- /// The TOKEN_INFORMATION_CLASS enumeration type contains values that
- /// specify the type of information being assigned to or retrieved from
- /// an access token.
- ///
- internal enum TOKEN_INFORMATION_CLASS
- {
- TokenUser = 1,
- TokenGroups,
- TokenPrivileges,
- TokenOwner,
- TokenPrimaryGroup,
- TokenDefaultDacl,
- TokenSource,
- TokenType,
- TokenImpersonationLevel,
- TokenStatistics,
- TokenRestrictedSids,
- TokenSessionId,
- TokenGroupsAndPrivileges,
- TokenSessionReference,
- TokenSandBoxInert,
- TokenAuditPolicy,
- TokenOrigin,
- TokenElevationType,
- TokenLinkedToken,
- TokenElevation,
- TokenHasRestrictions,
- TokenAccessInformation,
- TokenVirtualizationAllowed,
- TokenVirtualizationEnabled,
- TokenIntegrityLevel,
- TokenUIAccess,
- TokenMandatoryPolicy,
- TokenLogonSid,
- MaxTokenInfoClass
- }
-
- ///
- /// The WELL_KNOWN_SID_TYPE enumeration type is a list of commonly used
- /// security identifiers (SIDs). Programs can pass these values to the
- /// CreateWellKnownSid function to create a SID from this list.
- ///
- internal enum WELL_KNOWN_SID_TYPE
- {
- WinNullSid = 0,
- WinWorldSid = 1,
- WinLocalSid = 2,
- WinCreatorOwnerSid = 3,
- WinCreatorGroupSid = 4,
- WinCreatorOwnerServerSid = 5,
- WinCreatorGroupServerSid = 6,
- WinNtAuthoritySid = 7,
- WinDialupSid = 8,
- WinNetworkSid = 9,
- WinBatchSid = 10,
- WinInteractiveSid = 11,
- WinServiceSid = 12,
- WinAnonymousSid = 13,
- WinProxySid = 14,
- WinEnterpriseControllersSid = 15,
- WinSelfSid = 16,
- WinAuthenticatedUserSid = 17,
- WinRestrictedCodeSid = 18,
- WinTerminalServerSid = 19,
- WinRemoteLogonIdSid = 20,
- WinLogonIdsSid = 21,
- WinLocalSystemSid = 22,
- WinLocalServiceSid = 23,
- WinNetworkServiceSid = 24,
- WinBuiltinDomainSid = 25,
- WinBuiltinAdministratorsSid = 26,
- WinBuiltinUsersSid = 27,
- WinBuiltinGuestsSid = 28,
- WinBuiltinPowerUsersSid = 29,
- WinBuiltinAccountOperatorsSid = 30,
- WinBuiltinSystemOperatorsSid = 31,
- WinBuiltinPrintOperatorsSid = 32,
- WinBuiltinBackupOperatorsSid = 33,
- WinBuiltinReplicatorSid = 34,
- WinBuiltinPreWindows2000CompatibleAccessSid = 35,
- WinBuiltinRemoteDesktopUsersSid = 36,
- WinBuiltinNetworkConfigurationOperatorsSid = 37,
- WinAccountAdministratorSid = 38,
- WinAccountGuestSid = 39,
- WinAccountKrbtgtSid = 40,
- WinAccountDomainAdminsSid = 41,
- WinAccountDomainUsersSid = 42,
- WinAccountDomainGuestsSid = 43,
- WinAccountComputersSid = 44,
- WinAccountControllersSid = 45,
- WinAccountCertAdminsSid = 46,
- WinAccountSchemaAdminsSid = 47,
- WinAccountEnterpriseAdminsSid = 48,
- WinAccountPolicyAdminsSid = 49,
- WinAccountRasAndIasServersSid = 50,
- WinNTLMAuthenticationSid = 51,
- WinDigestAuthenticationSid = 52,
- WinSChannelAuthenticationSid = 53,
- WinThisOrganizationSid = 54,
- WinOtherOrganizationSid = 55,
- WinBuiltinIncomingForestTrustBuildersSid = 56,
- WinBuiltinPerfMonitoringUsersSid = 57,
- WinBuiltinPerfLoggingUsersSid = 58,
- WinBuiltinAuthorizationAccessSid = 59,
- WinBuiltinTerminalServerLicenseServersSid = 60,
- WinBuiltinDCOMUsersSid = 61,
- WinBuiltinIUsersSid = 62,
- WinIUserSid = 63,
- WinBuiltinCryptoOperatorsSid = 64,
- WinUntrustedLabelSid = 65,
- WinLowLabelSid = 66,
- WinMediumLabelSid = 67,
- WinHighLabelSid = 68,
- WinSystemLabelSid = 69,
- WinWriteRestrictedCodeSid = 70,
- WinCreatorOwnerRightsSid = 71,
- WinCacheablePrincipalsGroupSid = 72,
- WinNonCacheablePrincipalsGroupSid = 73,
- WinEnterpriseReadonlyControllersSid = 74,
- WinAccountReadonlyControllersSid = 75,
- WinBuiltinEventLogReadersGroup = 76,
- WinNewEnterpriseReadonlyControllersSid = 77,
- WinBuiltinCertSvcDComAccessGroup = 78
- }
-
- ///
- /// The SECURITY_IMPERSONATION_LEVEL enumeration type contains values
- /// that specify security impersonation levels. Security impersonation
- /// levels govern the degree to which a server process can act on behalf
- /// of a client process.
- ///
- internal enum SECURITY_IMPERSONATION_LEVEL
- {
- SecurityAnonymous,
- SecurityIdentification,
- SecurityImpersonation,
- SecurityDelegation
- }
-
- ///
- /// The TOKEN_ELEVATION_TYPE enumeration indicates the elevation type of
- /// token being queried by the GetTokenInformation function or set by
- /// the SetTokenInformation function.
- ///
- internal enum TOKEN_ELEVATION_TYPE
- {
- TokenElevationTypeDefault = 1,
- TokenElevationTypeFull,
- TokenElevationTypeLimited
- }
-
- ///
- /// The structure represents a security identifier (SID) and its
- /// attributes. SIDs are used to uniquely identify users or groups.
- ///
- [StructLayout(LayoutKind.Sequential)]
- internal struct SID_AND_ATTRIBUTES
- {
- public IntPtr Sid;
- public UInt32 Attributes;
- }
-
- ///
- /// The structure indicates whether a token has elevated privileges.
- ///
- [StructLayout(LayoutKind.Sequential)]
- internal struct TOKEN_ELEVATION
- {
- public Int32 TokenIsElevated;
- }
-
- ///
- /// The structure specifies the mandatory integrity level for a token.
- ///
- [StructLayout(LayoutKind.Sequential)]
- internal struct TOKEN_MANDATORY_LABEL
- {
- public SID_AND_ATTRIBUTES Label;
- }
-
- ///
- /// Represents a wrapper class for a token handle.
- ///
- internal class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
- {
- private SafeTokenHandle() : base(true)
- {
- }
-
- internal SafeTokenHandle(IntPtr handle) : base(true)
- {
- base.SetHandle(handle);
- }
-
- [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- internal static extern bool CloseHandle(IntPtr handle);
-
- protected override bool ReleaseHandle()
- {
- return CloseHandle(base.handle);
- }
- }
-
- internal class NativeMethods
- {
- // Token Specific Access Rights
-
- public const UInt32 STANDARD_RIGHTS_REQUIRED = 0x000F0000;
- public const UInt32 STANDARD_RIGHTS_READ = 0x00020000;
- public const UInt32 TOKEN_ASSIGN_PRIMARY = 0x0001;
- public const UInt32 TOKEN_DUPLICATE = 0x0002;
- public const UInt32 TOKEN_IMPERSONATE = 0x0004;
- public const UInt32 TOKEN_QUERY = 0x0008;
- public const UInt32 TOKEN_QUERY_SOURCE = 0x0010;
- public const UInt32 TOKEN_ADJUST_PRIVILEGES = 0x0020;
- public const UInt32 TOKEN_ADJUST_GROUPS = 0x0040;
- public const UInt32 TOKEN_ADJUST_DEFAULT = 0x0080;
- public const UInt32 TOKEN_ADJUST_SESSIONID = 0x0100;
- public const UInt32 TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY);
- public const UInt32 TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED |
- TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE |
- TOKEN_QUERY | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES |
- TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_SESSIONID);
-
-
- public const Int32 ERROR_INSUFFICIENT_BUFFER = 122;
-
-
- // Integrity Levels
-
- public const Int32 SECURITY_MANDATORY_UNTRUSTED_RID = 0x00000000;
- public const Int32 SECURITY_MANDATORY_LOW_RID = 0x00001000;
- public const Int32 SECURITY_MANDATORY_MEDIUM_RID = 0x00002000;
- public const Int32 SECURITY_MANDATORY_HIGH_RID = 0x00003000;
- public const Int32 SECURITY_MANDATORY_SYSTEM_RID = 0x00004000;
-
-
- ///
- /// The function opens the access token associated with a process.
- ///
- ///
- /// A handle to the process whose access token is opened.
- ///
- ///
- /// Specifies an access mask that specifies the requested types of
- /// access to the access token.
- ///
- ///
- /// Outputs a handle that identifies the newly opened access token
- /// when the function returns.
- ///
- ///
- [DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool OpenProcessToken(IntPtr hProcess,
- UInt32 desiredAccess, out SafeTokenHandle hToken);
-
-
- ///
- /// The function creates a new access token that duplicates one
- /// already in existence.
- ///
- ///
- /// A handle to an access token opened with TOKEN_DUPLICATE access.
- ///
- ///
- /// Specifies a SECURITY_IMPERSONATION_LEVEL enumerated type that
- /// supplies the impersonation level of the new token.
- ///
- ///
- /// Outputs a handle to the duplicate token.
- ///
- ///
- [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- public extern static bool DuplicateToken(
- SafeTokenHandle ExistingTokenHandle,
- SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
- out SafeTokenHandle DuplicateTokenHandle);
-
-
- ///
- /// The function retrieves a specified type of information about an
- /// access token. The calling process must have appropriate access
- /// rights to obtain the information.
- ///
- ///
- /// A handle to an access token from which information is retrieved.
- ///
- ///
- /// Specifies a value from the TOKEN_INFORMATION_CLASS enumerated
- /// type to identify the type of information the function retrieves.
- ///
- ///
- /// A pointer to a buffer the function fills with the requested
- /// information.
- ///
- ///
- /// Specifies the size, in bytes, of the buffer pointed to by the
- /// TokenInformation parameter.
- ///
- ///
- /// A pointer to a variable that receives the number of bytes needed
- /// for the buffer pointed to by the TokenInformation parameter.
- ///
- ///
- [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool GetTokenInformation(
- SafeTokenHandle hToken,
- TOKEN_INFORMATION_CLASS tokenInfoClass,
- IntPtr pTokenInfo,
- Int32 tokenInfoLength,
- out Int32 returnLength);
-
-
- ///
- /// Sets the elevation required state for a specified button or
- /// command link to display an elevated icon.
- ///
- public const UInt32 BCM_SETSHIELD = 0x160C;
-
-
- ///
- /// Sends the specified message to a window or windows. The function
- /// calls the window procedure for the specified window and does not
- /// return until the window procedure has processed the message.
- ///
- ///
- /// Handle to the window whose window procedure will receive the
- /// message.
- ///
- /// Specifies the message to be sent.
- ///
- /// Specifies additional message-specific information.
- ///
- ///
- /// Specifies additional message-specific information.
- ///
- ///
- [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)]
- public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, IntPtr lParam);
-
-
- ///
- /// The function returns a pointer to a specified subauthority in a
- /// security identifier (SID). The subauthority value is a relative
- /// identifier (RID).
- ///
- ///
- /// A pointer to the SID structure from which a pointer to a
- /// subauthority is to be returned.
- ///
- ///
- /// Specifies an index value identifying the subauthority array
- /// element whose address the function will return.
- ///
- ///
- /// If the function succeeds, the return value is a pointer to the
- /// specified SID subauthority. To get extended error information,
- /// call GetLastError. If the function fails, the return value is
- /// undefined. The function fails if the specified SID structure is
- /// not valid or if the index value specified by the nSubAuthority
- /// parameter is out of bounds.
- ///
- [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- public static extern IntPtr GetSidSubAuthority(IntPtr pSid, UInt32 nSubAuthority);
- }
- }
-}
diff --git a/SystemExtensions/SystemExtensions.csproj b/SystemExtensions/SystemExtensions.csproj
index ed85aca..5ebf10b 100644
--- a/SystemExtensions/SystemExtensions.csproj
+++ b/SystemExtensions/SystemExtensions.csproj
@@ -1,66 +1,8 @@
-
-
-
+
+
- Debug
- AnyCPU
- {55850FF3-70E4-4828-BEEE-39837AC0D24C}
- Library
- Properties
- SystemExtensions
- SystemExtensions
- v4.7.2
- 512
- true
-
+ netstandard2.0
+ true
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
- bin\Debug\SystemExtensions.xml
- false
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
diff --git a/SystemExtensionsTests/Collections/AVLTreeTests.cs b/SystemExtensionsTests/Collections/AVLTreeTests.cs
index 629fd62..aa7a62d 100644
--- a/SystemExtensionsTests/Collections/AVLTreeTests.cs
+++ b/SystemExtensionsTests/Collections/AVLTreeTests.cs
@@ -1,10 +1,6 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
-using SystemExtensions.Collections;
using System;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
diff --git a/SystemExtensionsTests/SystemExtensionsTests.csproj b/SystemExtensionsTests/SystemExtensionsTests.csproj
index 75d363c..f90de41 100644
--- a/SystemExtensionsTests/SystemExtensionsTests.csproj
+++ b/SystemExtensionsTests/SystemExtensionsTests.csproj
@@ -73,7 +73,7 @@
- {55850ff3-70e4-4828-beee-39837ac0d24c}
+ {8549fc12-b0bf-4957-a5db-ce9a17955589}
SystemExtensions