예제 #1
0
		public static void EnablePrivilege(SecurityEntity securityEntity)
		{
			var securityEntityValue = GetSecurityEntityValue(securityEntity);

			try
			{
				var locallyUniqueIdentifier = new NativeMethods.LUID();

				if (NativeMethods.LookupPrivilegeValue(null, securityEntityValue, ref locallyUniqueIdentifier))
				{
					var TOKEN_PRIVILEGES = new NativeMethods.TOKEN_PRIVILEGES();
					TOKEN_PRIVILEGES.PrivilegeCount = 1;
					TOKEN_PRIVILEGES.Attributes = NativeMethods.SE_PRIVILEGE_ENABLED;
					TOKEN_PRIVILEGES.Luid = locallyUniqueIdentifier;

					var tokenHandle = IntPtr.Zero;
					try
					{
						var currentProcess = NativeMethods.GetCurrentProcess();
						if (NativeMethods.OpenProcessToken(currentProcess, NativeMethods.TOKEN_ADJUST_PRIVILEGES | NativeMethods.TOKEN_QUERY, out tokenHandle))
						{
							if (NativeMethods.AdjustTokenPrivileges(tokenHandle, false, ref TOKEN_PRIVILEGES, 1024, IntPtr.Zero, IntPtr.Zero))
							{
								var lastError = Marshal.GetLastWin32Error();
								if (lastError == NativeMethods.ERROR_NOT_ALL_ASSIGNED)
								{
									var win32Exception = new Win32Exception();
									throw new InvalidOperationException("AdjustTokenPrivileges failed.", win32Exception);
								}
							}
							else
							{
								var win32Exception = new Win32Exception();
								throw new InvalidOperationException("AdjustTokenPrivileges failed.", win32Exception);
							}
						}
						else
						{
							var win32Exception = new Win32Exception();
							var exceptionMessage = string.Format(CultureInfo.InvariantCulture, "OpenProcessToken failed. CurrentProcess: {0}", currentProcess.ToInt32());
							throw new InvalidOperationException(exceptionMessage, win32Exception);
						}
					}
					finally
					{
						if (tokenHandle != IntPtr.Zero)
						{
							NativeMethods.CloseHandle(tokenHandle);
						}
					}
				}
				else
				{
					var win32Exception = new Win32Exception();
					var exceptionMessage = string.Format(CultureInfo.InvariantCulture, "LookupPrivilegeValue failed. SecurityEntityValue: {0}", securityEntityValue);
					throw new InvalidOperationException(exceptionMessage, win32Exception);
				}
			}
			catch (Exception e)
			{
				var exceptionMessage = string.Format(CultureInfo.InvariantCulture, "GrandPrivilege failed. SecurityEntity: {0}", securityEntity);
				throw new InvalidOperationException(exceptionMessage, e);
			}
		}
예제 #2
0
        public static void EnablePrivilege(SecurityEntity securityEntity)
        {
            var securityEntityValue = GetSecurityEntityValue(securityEntity);

            try
            {
                var locallyUniqueIdentifier = new NativeMethods.LUID();

                if (NativeMethods.LookupPrivilegeValue(null, securityEntityValue, ref locallyUniqueIdentifier))
                {
                    var TOKEN_PRIVILEGES = new NativeMethods.TOKEN_PRIVILEGES();
                    TOKEN_PRIVILEGES.PrivilegeCount = 1;
                    TOKEN_PRIVILEGES.Attributes     = NativeMethods.SE_PRIVILEGE_ENABLED;
                    TOKEN_PRIVILEGES.Luid           = locallyUniqueIdentifier;

                    var tokenHandle = IntPtr.Zero;
                    try
                    {
                        var currentProcess = NativeMethods.GetCurrentProcess();
                        if (NativeMethods.OpenProcessToken(currentProcess, NativeMethods.TOKEN_ADJUST_PRIVILEGES | NativeMethods.TOKEN_QUERY, out tokenHandle))
                        {
                            if (NativeMethods.AdjustTokenPrivileges(tokenHandle, false, ref TOKEN_PRIVILEGES, 1024, IntPtr.Zero, IntPtr.Zero))
                            {
                                var lastError = Marshal.GetLastWin32Error();
                                if (lastError == NativeMethods.ERROR_NOT_ALL_ASSIGNED)
                                {
                                    var win32Exception = new Win32Exception();
                                    throw new InvalidOperationException("AdjustTokenPrivileges failed.", win32Exception);
                                }
                            }
                            else
                            {
                                var win32Exception = new Win32Exception();
                                throw new InvalidOperationException("AdjustTokenPrivileges failed.", win32Exception);
                            }
                        }
                        else
                        {
                            var win32Exception   = new Win32Exception();
                            var exceptionMessage = string.Format(CultureInfo.InvariantCulture, "OpenProcessToken failed. CurrentProcess: {0}", currentProcess.ToInt32());
                            throw new InvalidOperationException(exceptionMessage, win32Exception);
                        }
                    }
                    finally
                    {
                        if (tokenHandle != IntPtr.Zero)
                        {
                            NativeMethods.CloseHandle(tokenHandle);
                        }
                    }
                }
                else
                {
                    var win32Exception   = new Win32Exception();
                    var exceptionMessage = string.Format(CultureInfo.InvariantCulture, "LookupPrivilegeValue failed. SecurityEntityValue: {0}", securityEntityValue);
                    throw new InvalidOperationException(exceptionMessage, win32Exception);
                }
            }
            catch (Exception e)
            {
                var exceptionMessage = string.Format(CultureInfo.InvariantCulture, "GrandPrivilege failed. SecurityEntity: {0}", securityEntity);
                throw new InvalidOperationException(exceptionMessage, e);
            }
        }