Пример #1
0
        public Exec(
            ProcessArguments arguments,
            ExecFlags flags = None,
            ConsoleRedirection outputRedirection = null,
            Action <StreamWriter> inputHandler   = null,
            string workingDirectory = null,
            IReadOnlyDictionary <string, string> environmentVariables = null)
        {
            Arguments = arguments;

            if (Arguments.Count < 1)
            {
                throw new ArgumentOutOfRangeException(
                          nameof(arguments),
                          "must have at least one argument (the file name to execute)");
            }

            Flags             = flags;
            InputHandler      = inputHandler;
            OutputRedirection = outputRedirection;

            if (Flags.HasFlag(RedirectStdin) && InputHandler == null)
            {
                throw new ArgumentException(
                          $"{nameof (RedirectStdin)} was specified " +
                          $"but {nameof (InputHandler)} is null",
                          nameof(flags));
            }

            if (Flags.HasFlag(RedirectStdout) && OutputRedirection == null)
            {
                throw new ArgumentException(
                          $"{nameof (RedirectStdout)} was specified " +
                          $"but {nameof (OutputRedirection)} is null",
                          nameof(flags));
            }

            if (Flags.HasFlag(RedirectStderr) && OutputRedirection == null)
            {
                throw new ArgumentException(
                          $"{nameof (RedirectStderr)} was specified " +
                          $"but {nameof (OutputRedirection)} is null",
                          nameof(flags));
            }

            WorkingDirectory     = workingDirectory;
            EnvironmentVariables = environmentVariables ?? new Dictionary <string, string> ();

            id = lastId++;
        }
Пример #2
0
        public Exec(
            ProcessArguments arguments,
            ExecFlags flags = None,
            ConsoleRedirection outputRedirection = null,
            Action <StreamWriter> inputHandler   = null,
            string workingDirectory            = null,
            ProcessRunnerHandler processRunner = null)
        {
            Arguments = arguments;

            if (Arguments.Count < 1)
            {
                throw new ArgumentOutOfRangeException(
                          nameof(arguments),
                          "must have at least one argument (the file name to execute)");
            }

            Id                = lastId++;
            Flags             = flags;
            Elevated          = flags.HasFlag(Elevate);
            InputHandler      = inputHandler;
            OutputRedirection = outputRedirection;

            if (isWindows)
            {
                // Ignore elevation flag if we are already running in the Administrator role
                var identity = WindowsIdentity.GetCurrent();
                if (identity != null && new WindowsPrincipal(identity).IsInRole(WindowsBuiltInRole.Administrator))
                {
                    Elevated = false;
                }
            }
            else
            {
                if (Path.GetExtension(arguments [0]) == ".exe")
                {
                    Arguments = Arguments.Insert(0, "mono");
                }

                if (Elevated)
                {
                    if (geteuid() == 0)
                    {
                        Elevated = false;
                    }
                    else
                    {
                        Arguments = Arguments.Insert(0, "/usr/bin/sudo");
                    }
                }
            }

            if (Flags.HasFlag(RedirectStdin) && InputHandler == null)
            {
                throw new ArgumentException(
                          $"{nameof (RedirectStdin)} was specified " +
                          $"but {nameof (InputHandler)} is null",
                          nameof(flags));
            }

            if (Flags.HasFlag(RedirectStdout) && OutputRedirection == null)
            {
                throw new ArgumentException(
                          $"{nameof (RedirectStdout)} was specified " +
                          $"but {nameof (OutputRedirection)} is null",
                          nameof(flags));
            }

            if (Flags.HasFlag(RedirectStderr) && OutputRedirection == null)
            {
                throw new ArgumentException(
                          $"{nameof (RedirectStderr)} was specified " +
                          $"but {nameof (OutputRedirection)} is null",
                          nameof(flags));
            }

            WorkingDirectory = workingDirectory;
            ProcessRunner    = processRunner
                               ?? GlobalProcessRunner
                               ?? DefaultProcessRunner;
        }