public ProcessExecutionResult Execute(string fileName, string inputData, int timeLimit, int memoryLimit)
        {
            var process = new DifferentUserProcessExecutor(fileName, Environment.UserDomainName, UserName, Password);

            process.SetTextToWrite(inputData);

            var executorInfo = process.Start(timeLimit, memoryLimit);

            var result = new ProcessExecutionResult
            {
                ReceivedOutput          = executorInfo.StandardOutputContent,
                ErrorOutput             = executorInfo.StandardErrorContent,
                ExitCode                = process.Process.ExitCode,
                Type                    = ProcessExecutionResultType.Success,
                TimeWorked              = process.Process.ExitTime - process.Process.StartTime,
                MemoryUsed              = executorInfo.MaxMemoryUsed,
                PrivilegedProcessorTime = process.Process.PrivilegedProcessorTime,
                UserProcessorTime       = process.Process.UserProcessorTime,
            };

            if (executorInfo.ProcessKilledBecauseOfTimeLimit)
            {
                result.Type = ProcessExecutionResultType.TimeLimit;
            }

            if (!string.IsNullOrEmpty(executorInfo.StandardErrorContent))
            {
                result.Type = ProcessExecutionResultType.RunTimeError;
            }

            return(result);
        }
        public ProcessExecutionResult Execute(string fileName, string inputData, int timeLimit, int memoryLimit, IEnumerable<string> executionArguments = null)
        {
            var process = new DifferentUserProcessExecutor(fileName, Environment.UserDomainName, UserName, Password);
            process.SetTextToWrite(inputData);

            var executorInfo = process.Start(timeLimit, memoryLimit);

            var result = new ProcessExecutionResult
                             {
                                 ReceivedOutput = executorInfo.StandardOutputContent,
                                 ErrorOutput = executorInfo.StandardErrorContent,
                                 ExitCode = process.Process.ExitCode,
                                 Type = ProcessExecutionResultType.Success,
                                 TimeWorked = process.Process.ExitTime - process.Process.StartTime,
                                 MemoryUsed = executorInfo.MaxMemoryUsed,
                                 PrivilegedProcessorTime = process.Process.PrivilegedProcessorTime,
                                 UserProcessorTime = process.Process.UserProcessorTime,
                             };

            if (executorInfo.ProcessKilledBecauseOfTimeLimit)
            {
                result.Type = ProcessExecutionResultType.TimeLimit;
            }

            if (!string.IsNullOrEmpty(executorInfo.StandardErrorContent))
            {
                result.Type = ProcessExecutionResultType.RunTimeError;
            }

            return result;
        }
        private static void ExecuteProcessWithDifferentUser(string applicationPath, string textToWrite, int timeLimit, int memoryLimit)
        {
            try
            {
                var process = new DifferentUserProcessExecutor(applicationPath, Environment.UserDomainName, UserName, Password);
                process.Process.Exited += ProcessOnExited;
                process.SetTextToWrite(textToWrite);
                Console.WriteLine("Chars to write to the process: {0}", process.CharsToWrite.Length);
                Console.WriteLine("Starting sandbox target process...");
                var executionInfo = process.Start(timeLimit, memoryLimit);

                Console.WriteLine("================== Process output ==================");
                Console.WriteLine(executionInfo.StandardOutputContent);

                if (!string.IsNullOrEmpty(executionInfo.StandardErrorContent))
                {
                    Console.WriteLine("================== Process error ===================");
                    Console.WriteLine(executionInfo.StandardErrorContent);
                }

                // Process information
                Console.WriteLine("================== Process info ====================");
                Console.WriteLine(ProcessInfoFormat, "Id:", process.Process.Id);
                Console.WriteLine(ProcessInfoFormat, "HasExited:", process.Process.HasExited);
                Console.WriteLine(ProcessInfoFormat, "ExitCode:", process.Process.ExitCode);
                Console.WriteLine(ProcessInfoFormat, "Error code description:", new Win32Exception(process.Process.ExitCode).Message);
                Console.WriteLine(ProcessInfoFormat, "PriorityClass:", process.Process.PriorityClass);
                Console.WriteLine(ProcessInfoTimeFormat, "StartTime:", process.Process.StartTime);
                Console.WriteLine(ProcessInfoTimeFormat, "ExitTime:", process.Process.ExitTime);
                Console.WriteLine(ProcessInfoFormat, "PrivilegedProcessorTime:", process.Process.PrivilegedProcessorTime);
                Console.WriteLine(ProcessInfoFormat, "UserProcessorTime:", process.Process.UserProcessorTime);
                Console.WriteLine(ProcessInfoFormat, "TotalProcessorTime:", process.Process.TotalProcessorTime);
                Console.WriteLine(ProcessInfoFormat, "ExitTime - StartTime:", process.Process.ExitTime - process.Process.StartTime);
                //// When process is exited no access to: process.BasePriority, process.HandleCount, MaxWorkingSet, etc.
                Console.WriteLine("==================== More info =====================");
                Console.WriteLine(ProcessInfoFormat, "ProcessKilledBecauseOfTimeLimit:", executionInfo.ProcessKilledBecauseOfTimeLimit);
                Console.WriteLine("====================================================");
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex);
                //// throw;
            }
        }