Example #1
0
        public static async Task <bool> GetIsMakerImageAsync()
        {
            var cmdOutput      = string.Empty;
            var standardOutput = new InMemoryRandomAccessStream();
            var options        = new ProcessLauncherOptions
            {
                StandardOutput = standardOutput
            };
            var output = await ProcessLauncher.RunToCompletionAsync(CommandLineProcesserExe, RegKeyQueryCmdArg, options);

            if (output != null && output.ExitCode == 0)
            {
                using (var outStreamRedirect = standardOutput.GetInputStreamAt(0))
                {
                    using (var dataReader = new DataReader(outStreamRedirect))
                    {
                        uint bytesLoaded = 0;
                        while ((bytesLoaded = await dataReader.LoadAsync(CmdLineBufSize)) > 0)
                        {
                            cmdOutput += dataReader.ReadString(bytesLoaded);
                        }
                    }
                }
                Match match = Regex.Match(cmdOutput, ExpectedResultPattern, RegexOptions.IgnoreCase);
                if (match.Success)
                {
                    return(true);
                }
                else
                {
                    ServiceUtil.LogService.Write("Could not get IsMakerImage. Output: " + cmdOutput);
                }
            }
            return(false);
        }
Example #2
0
        public static async Task SetAudioRenderVolume(int volume, bool retryOnException)
        {
            var result = await ProcessLauncher.RunToCompletionAsync(@"SetAudioRenderVolume.exe", volume.ToString(CultureInfo.InvariantCulture));

            if (result.ExitCode != 200)
            {
                await Logger.Write("Could not set audio render volume.");
            }
        }
Example #3
0
        public static async Task <ProcessLauncherOutput> RunCommandAsync(string fileName, string args)
        {
            var output = new ProcessLauncherOutput();

            try
            {
                using (var standardOutput = new InMemoryRandomAccessStream())
                    using (var standardError = new InMemoryRandomAccessStream())
                    {
                        var options = new ProcessLauncherOptions
                        {
                            StandardOutput = standardOutput,
                            StandardError  = standardError
                        };

                        var result = await ProcessLauncher.RunToCompletionAsync(
                            fileName,
                            args,
                            options);

                        output.Result = result;

                        using (IInputStream inputStream = standardOutput.GetInputStreamAt(0))
                        {
                            ulong size = standardOutput.Size;

                            using (var dataReader = new DataReader(inputStream))
                            {
                                uint bytesLoaded = await dataReader.LoadAsync((uint)size);

                                output.Output = dataReader.ReadString(bytesLoaded);
                            }
                        }

                        using (IInputStream inputStream = standardError.GetInputStreamAt(0))
                        {
                            ulong size = standardError.Size;

                            using (var dataReader = new DataReader(inputStream))
                            {
                                uint bytesLoaded = await dataReader.LoadAsync((uint)size);

                                output.Error = dataReader.ReadString(bytesLoaded);
                            }
                        }
                    }

                return(output);
            }
            catch (Exception ex)
            {
                ServiceUtil.LogService.WriteException(ex);
            }

            return(null);
        }
Example #4
0
        public static async Task SetAudioCaptureVolume(double volume, bool retryOnException)
        {
            //96.14% db equals 90% volume with Logitech G933 Headset
            var result = await ProcessLauncher.RunToCompletionAsync(@"SetAudioCaptureVolume.exe", volume.ToString(CultureInfo.InvariantCulture));

            if (result.ExitCode != 200)
            {
                await Logger.Write("Could not set audio capture volume.");
            }
        }
Example #5
0
        private async Task RunProcess()
        {
            var options        = new ProcessLauncherOptions();
            var standardOutput = new InMemoryRandomAccessStream();
            var standardError  = new InMemoryRandomAccessStream();

            options.StandardOutput = standardOutput;
            options.StandardError  = standardError;

            await CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
            {
                try
                {
                    var result = await ProcessLauncher.RunToCompletionAsync(cmd.Text, args.Text == null ? string.Empty : args.Text, options);

                    ProcessExitCode.Text += "Process Exit Code: " + result.ExitCode;

                    using (var outStreamRedirect = standardOutput.GetInputStreamAt(0))
                    {
                        var size = standardOutput.Size;
                        using (var dataReader = new DataReader(outStreamRedirect))
                        {
                            var bytesLoaded     = await dataReader.LoadAsync((uint)size);
                            var stringRead      = dataReader.ReadString(bytesLoaded);
                            StdOutputText.Text += stringRead;
                        }
                    }

                    using (var errStreamRedirect = standardError.GetInputStreamAt(0))
                    {
                        using (var dataReader = new DataReader(errStreamRedirect))
                        {
                            var size           = standardError.Size;
                            var bytesLoaded    = await dataReader.LoadAsync((uint)size);
                            var stringRead     = dataReader.ReadString(bytesLoaded);
                            StdErrorText.Text += stringRead;
                        }
                    }
                }
                catch (UnauthorizedAccessException uex)
                {
                    StdErrorText.Text += "Exception Thrown: " + uex.Message + "\n";
                    StdErrorText.Text += "\nMake sure you're allowed to run the specified exe; either\n" +
                                         "\t1) Add the exe to the AppX package, or\n" +
                                         "\t2) Add the absolute path of the exe to the allow list:\n" +
                                         "\t\tHKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\EmbeddedMode\\ProcessLauncherAllowedExecutableFilesList.\n\n" +
                                         "Also, make sure the <iot:Capability Name=\"systemManagement\" /> has been added to the AppX manifest capabilities.\n";
                }
                catch (Exception ex)
                {
                    StdErrorText.Text += "Exception Thrown:" + ex.Message + "\n";
                    StdErrorText.Text += ex.StackTrace + "\n";
                }
            });
        }
Example #6
0
        public static async Task Restart()
        {
            if (!_initialized)
            {
                return;
            }

            await StopAll();

            await AudioPlayerController.PlayAndWaitAsync(AudioName.Restart);

            await ProcessLauncher.RunToCompletionAsync(@"CmdWrapper.exe", "\"shutdown -r -t 0\"");
        }
Example #7
0
        private async void button_ClickAsync(object sender, RoutedEventArgs e)
        {
            var options        = new ProcessLauncherOptions();
            var standardOutput = new InMemoryRandomAccessStream();
            var standardError  = new InMemoryRandomAccessStream();

            options.StandardOutput = standardOutput;
            options.StandardError  = standardError;


            //var options = new ProcessLauncherOptions();

            await CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => {
                const string CommandLineProcesserExe = "c:\\windows\\system32\\cmd.exe";
                //var result = await ProcessLauncher.RunToCompletionAsync(CommandLineProcesserExe, String.Empty, options);
                var result = await ProcessLauncher.RunToCompletionAsync(@"ConsoleApp1.exe", String.Empty, options);

                //await ExecuteCommandLineString(@"C:\Program Files (x86)\KeePass Password Safe 2\KeePass.exe");
            });

            //var result = await ProcessLauncher.RunToCompletionAsync(@"C:\Program Files (x86)\KeePass Password Safe 2\KeePass.exe","\"D:\\KeePass\\KeePass.kdbx\" -pw-stdin", options);


            //reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\EmbeddedMode\ProcessLauncher" /v AllowedExecutableFilesList /t REG_MULTI_SZ /d "C:\Program Files (x86)\KeePass Password Safe 2\KeePass.exe\0"
            //var result = await ProcessLauncher.RunToCompletionAsync(@"D:\ConsoleApp1.exe", String.Empty, options);
            //"c:\windows\system32\cmd.exe"

            //REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\EmbeddedMode\ProcessLauncher" /v AllowedExecutableFilesList

            //reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\EmbeddedMode\ProcessLauncher" /f /v AllowedExecutableFilesList /t REG_MULTI_SZ /d "c:\windows\system32\cmd.exe\0"

            //reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\EmbeddedMode\ProcessLauncher" /f /v AllowedExecutableFilesList /t REG_MULTI_SZ /d "E:\Tests\HelloWorldUWP\HelloWorldUWP\ConsoleApp1.exe\0"

            //reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\EmbeddedMode\ProcessLauncher" / f / v AllowedExecutableFilesList / t REG_MULTI_SZ / d "E:\Tests\HelloWorldUWP\HelloWorldUWP\ConsoleApp1.exe\0"

            //IAsyncOperation<ProcessLauncherResult> RunToCompletionAsync(string fileName, string args, ProcessLauncherOptions options)

            /*pProcess.StartInfo.FileName = @"C:\Program Files (x86)\KeePass Password Safe 2\KeePass.exe";
             * pProcess.StartInfo.Arguments = "\"D:\\KeePass\\KeePass.kdbx\" -pw-stdin";
             *
             * pProcess.StartInfo.UseShellExecute = false;
             * pProcess.StartInfo.RedirectStandardInput = true;
             * pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
             *
             *
             * pProcess.Start();
             *
             * pProcess.StandardInput.WriteLine("q1w2e3r4");
             * pProcess.StandardInput.Close();*/
        }
Example #8
0
        private void StartProxyProcess()
        {
            processLauncherOptions = new ProcessLauncherOptions();
            standardInput          = new InMemoryRandomAccessStream();

            processLauncherOptions.StandardOutput = null;
            processLauncherOptions.StandardError  = null;
            processLauncherOptions.StandardInput  = standardInput.GetInputStreamAt(0);

            processLauncherResult = ProcessLauncher.RunToCompletionAsync(
                "comm-proxy.exe",
                "com.microsoft.echo" + " " + Package.Current.Id.FamilyName,
                processLauncherOptions);
        }
Example #9
0
        public async Task RunProcess(string cmd, string args)
        {
            var options        = new ProcessLauncherOptions();
            var standardOutput = new InMemoryRandomAccessStream();
            var standardError  = new InMemoryRandomAccessStream();

            options.StandardOutput = standardOutput;
            options.StandardError  = standardError;

            await CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
            {
                try
                {
                    var result = await ProcessLauncher.RunToCompletionAsync(cmd, args == null ? string.Empty : args, options);

                    //ProcessExitCode.Text += "Process Exit Code: " + result.ExitCode;

                    using (var outStreamRedirect = standardOutput.GetInputStreamAt(0))
                    {
                        var size = standardOutput.Size;
                        using (var dataReader = new DataReader(outStreamRedirect))
                        {
                            var bytesLoaded = await dataReader.LoadAsync((uint)size);
                            var stringRead  = dataReader.ReadString(bytesLoaded);
                            Debug.WriteLine(cmd + "Output:" + stringRead);
                            //StdOutputText.Text += stringRead;
                        }
                    }

                    using (var errStreamRedirect = standardError.GetInputStreamAt(0))
                    {
                        using (var dataReader = new DataReader(errStreamRedirect))
                        {
                            var size        = standardError.Size;
                            var bytesLoaded = await dataReader.LoadAsync((uint)size);
                            var stringRead  = dataReader.ReadString(bytesLoaded);
                            Debug.WriteLine(cmd + "Error:" + stringRead);
                            //StdErrorText.Text += stringRead;
                        }
                    }
                }
                catch (UnauthorizedAccessException uex)
                {
                }
                catch (Exception ex)
                {
                }
            });
        }
Example #10
0
        private async Task <bool> IsMakerImager()
        {
            var cmdOutput = string.Empty;

            var standardOutput = new InMemoryRandomAccessStream();
            var options        = new ProcessLauncherOptions
            {
                StandardOutput = standardOutput
            };

            try
            {
                var result = await ProcessLauncher.RunToCompletionAsync(CommandLineProcesserExe, RegKeyQueryCmdArg, options);

                if (result.ExitCode == 0)
                {
                    using (var outStreamRedirect = standardOutput.GetInputStreamAt(0))
                    {
                        using (var dataReader = new DataReader(outStreamRedirect))
                        {
                            uint bytesLoaded = 0;
                            while ((bytesLoaded = await dataReader.LoadAsync(CmdLineBufSize)) > 0)
                            {
                                cmdOutput += dataReader.ReadString(bytesLoaded);
                            }
                        }
                    }
                }

                Match match = Regex.Match(cmdOutput, ExpectedResultPattern, RegexOptions.IgnoreCase);
                if (match.Success)
                {
                    return(true);
                }
            }
            catch (Exception ex)
            {
                // Could not read the value
                Log.Write("Could not read maker image value in registry");
                Log.Write(ex.ToString());
            }

            return(false);
        }
Example #11
0
        public void Start()
        {
            if (_processExecutionTask != null)
            {
                return;
            }

            _processExecutionTask = ProcessLauncher
                                    .RunToCompletionAsync(_command, _args, new ProcessLauncherOptions
            {
                StandardInput    = _inputStream,
                StandardOutput   = _standardOutWatcher,
                StandardError    = _standardErrWatcher,
                WorkingDirectory = _workingDirectory,
            })
                                    .AsTask(_cancellationSource.Token)
                                    .ContinueWith(OnProcessCompleted, TaskContinuationOptions.OnlyOnRanToCompletion)
                                    .ContinueWith(OnProcessFaulted, TaskContinuationOptions.OnlyOnFaulted);
        }
        public async Task <IResponse> SendCommandAsync(IRequest command)
        {
            var processLauncherOptions = new ProcessLauncherOptions();
            var standardInput          = new InMemoryRandomAccessStream();
            var standardOutput         = new InMemoryRandomAccessStream();

            processLauncherOptions.StandardOutput = standardOutput;
            processLauncherOptions.StandardError  = null;
            processLauncherOptions.StandardInput  = standardInput.GetInputStreamAt(0);

            await command.Serialize().WriteToIOutputStreamAsync(standardInput);

            standardInput.Dispose();

            var processLauncherResult = await ProcessLauncher.RunToCompletionAsync(@"C:\Windows\System32\CommProxy.exe", "", processLauncherOptions);

            if (processLauncherResult.ExitCode == 0)
            {
                using (var outStreamRedirect = standardOutput.GetInputStreamAt(0))
                {
                    var response = (await Blob.ReadFromIInputStreamAsync(outStreamRedirect)).MakeIResponse();
                    if (response.Status != ResponseStatus.Success)
                    {
                        var stringResponse = response as StringResponse;
                        if (stringResponse != null)
                        {
                            throw new Exception(stringResponse.Response);
                        }
                        throw new Exception("Operation failed");
                    }
                    return(response);
                }
            }
            else
            {
                throw new Exception("CommProxy cannot read data from the input pipe");
            }
        }
Example #13
0
        private void LaunchCmdProcess(string commandLineText)
        {
            var args           = String.Format("/C \"{0}\"", commandLineText);;
            var standardOutput = new InMemoryRandomAccessStream();
            var standardError  = new InMemoryRandomAccessStream();
            var options        = new ProcessLauncherOptions
            {
                StandardOutput   = standardOutput,
                StandardError    = standardError,
                WorkingDirectory = GetWorkingDirectory()
            };
            string       stdErrRunText = string.Empty;
            CommandError commandError  = CommandError.None;

            isProcessRunning                   = true;
            isProcessTimedOut                  = false;
            lastOutputTime                     = DateTime.Now;
            processLauncherOperation           = ProcessLauncher.RunToCompletionAsync(CommandLineProcesserExe, args, options);
            processLauncherOperation.Completed = (operation, status) =>
            {
                isProcessRunning = false;

                if (status == AsyncStatus.Canceled)
                {
                    if (isProcessTimedOut)
                    {
                        commandError  = CommandError.TimedOut;
                        stdErrRunText = "\n" + String.Format(resourceLoader.GetString("CommandTimeoutText"), TimeOutAfterNoOutput.Seconds);
                    }
                    else
                    {
                        commandError  = CommandError.Cancelled;
                        stdErrRunText = "\n" + resourceLoader.GetString("CommandCancelled");
                    }
                }
                else if (status == AsyncStatus.Error)
                {
                    if (operation.ErrorCode.HResult == HRESULT_AccessDenied)
                    {
                        commandError  = CommandError.NotAuthorized;
                        stdErrRunText = String.Format(resourceLoader.GetString("CmdNotEnabled"), EnableCommandLineProcesserRegCommand);
                    }
                    else
                    if (operation.ErrorCode.HResult == HRESULT_InvalidDirectory)
                    {
                        commandError  = CommandError.InvalidDirectory;
                        stdErrRunText = String.Format(resourceLoader.GetString("WorkingDirectoryInvalid"), options.WorkingDirectory);
                    }
                    else
                    {
                        commandError  = CommandError.GenericError;
                        stdErrRunText = String.Format(resourceLoader.GetString("CommandLineError"), operation.ErrorCode.Message);
                    }
                }

                if (commandError != CommandError.None)
                {
                    ShowError(stdErrRunText);

                    if (commandError == CommandError.NotAuthorized)
                    {
                        ShowAuthorizationUI();
                    }
                }

                if (commandError == CommandError.InvalidDirectory)
                {
                    EnableCommandLineTextBox(true, WorkingDirectory);
                }
                else
                {
                    EnableCommandLineTextBox(true, CommandLine);
                }
            };

            var stdOutTask = ThreadPool.RunAsync(async(t) =>
            {
                using (var outStreamRedirect = standardOutput.GetInputStreamAt(0))
                {
                    using (var streamReader = new StreamReader(outStreamRedirect.AsStreamForRead()))
                    {
                        await ReadText(streamReader);
                    }
                }
            }).AsTask();

            var stdErrTask = ThreadPool.RunAsync(async(t) =>
            {
                using (var errStreamRedirect = standardError.GetInputStreamAt(0))
                {
                    using (var streamReader = new StreamReader(errStreamRedirect.AsStreamForRead()))
                    {
                        await ReadText(streamReader, isErrorRun: true);
                    }
                }
            }).AsTask();

            Task[] tasks = new Task[2]
            {
                stdOutTask,
                stdErrTask
            };

            Task.WaitAll(tasks);
        }
        private async Task RunProcess()
        {
            if (string.IsNullOrWhiteSpace(CommandLine.Text))
            {
                return;
            }

            commandLineHistory.Add(CommandLine.Text);
            currentCommandLine = commandLineHistory.Count;

            bool isCmdAuthorized = true;
            Run  cmdLineRun      = new Run();

            cmdLineRun.Foreground = new SolidColorBrush(Windows.UI.Colors.LightGray);
            cmdLineRun.FontWeight = FontWeights.Bold;
            cmdLineRun.Text       = currentDirectory + "> " + CommandLine.Text + "\n";

            Run stdOutRun = new Run();
            Run stdErrRun = new Run();

            stdErrRun.Foreground = new SolidColorBrush(Windows.UI.Colors.Red);

            var commandLineText = CommandLine.Text.Trim();

            if (commandLineText.Equals("cls", StringComparison.CurrentCultureIgnoreCase))
            {
                StdOutputText.Blocks.Clear();
                return;
            }
            else if (commandLineText.StartsWith("cd ", StringComparison.CurrentCultureIgnoreCase) || commandLineText.Equals("cd", StringComparison.CurrentCultureIgnoreCase))
            {
                stdErrRun.Text = resourceLoader.GetString("CdNotSupported");
            }
            else if (commandLineText.Equals("exit", StringComparison.CurrentCultureIgnoreCase))
            {
                NavigationUtils.GoBack();
            }
            else
            {
                var standardOutput = new InMemoryRandomAccessStream();
                var standardError  = new InMemoryRandomAccessStream();
                var options        = new ProcessLauncherOptions
                {
                    StandardOutput = standardOutput,
                    StandardError  = standardError
                };

                try
                {
                    var args   = "/C \"cd \"" + currentDirectory + "\" & " + commandLineText + "\"";
                    var result = await ProcessLauncher.RunToCompletionAsync(CommandLineProcesserExe, args, options);

                    // First write std out
                    using (var outStreamRedirect = standardOutput.GetInputStreamAt(0))
                    {
                        using (var dataReader = new DataReader(outStreamRedirect))
                        {
                            await ReadText(dataReader, stdOutRun);
                        }
                    }

                    // Then write std err
                    using (var errStreamRedirect = standardError.GetInputStreamAt(0))
                    {
                        using (var dataReader = new DataReader(errStreamRedirect))
                        {
                            await ReadText(dataReader, stdErrRun);
                        }
                    }
                }
                catch (UnauthorizedAccessException uex)
                {
                    isCmdAuthorized = false;
                    var errorMessage = uex.Message + "\n\n" + resourceLoader.GetString("CmdNotEnabled");
                    stdErrRun.Text = errorMessage;
                }
                catch (Exception ex)
                {
                    var errorMessage = ex.Message + "\n" + ex.StackTrace + "\n";
                    stdErrRun.Text = errorMessage;
                }
            }

            await CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                Paragraph paragraph = new Paragraph();

                paragraph.Inlines.Add(cmdLineRun);
                paragraph.Inlines.Add(stdOutRun);
                paragraph.Inlines.Add(stdErrRun);

                if (!isCmdAuthorized)
                {
                    InlineUIContainer uiContainer = new InlineUIContainer();
                    Button cmdEnableButton        = new Button();
                    cmdEnableButton.Content       = resourceLoader.GetString("EnableCmdText");
                    cmdEnableButton.Click        += AccessButtonClicked;
                    uiContainer.Child             = cmdEnableButton;
                    paragraph.Inlines.Add(uiContainer);
                }

                StdOutputText.Blocks.Add(paragraph);
            });
        }
        private async Task <CdResult> ExecuteCdCmd(string strCmd)
        {
            var curDir = currentDirectory;

            if (strCmd.StartsWith("cd ", StringComparison.CurrentCultureIgnoreCase))
            {
                try
                {
                    var args = strCmd.Substring(3).Trim();

                    if (string.IsNullOrEmpty(args) || string.IsNullOrEmpty(args.Replace('\\', ' ').Replace('/', ' ').Trim()))
                    {
                        currentDirectory = "C:\\";
                        return(CdResult.Succeed);
                    }

                    if (args.Contains("*"))
                    {
                        return(CdResult.InvalidPath);
                    }

                    var cmdout = new InMemoryRandomAccessStream();
                    var cmderr = new InMemoryRandomAccessStream();

                    if (args.StartsWith("C:\\", StringComparison.CurrentCultureIgnoreCase) ||
                        args.StartsWith("C:/", StringComparison.CurrentCultureIgnoreCase))
                    {
                        curDir = "C:\\";
                        args   = args.Substring(3);
                    }

                    ProcessLauncherOptions options = new ProcessLauncherOptions()
                    {
                        StandardOutput   = cmdout,
                        StandardError    = cmderr,
                        WorkingDirectory = curDir
                    };

                    foreach (var item in args.Split('\\', '/'))
                    {
                        var dirStr = item.Trim();
                        if (dirStr.Equals(".."))
                        {
                            if (!curDir.Equals("C:\\", StringComparison.CurrentCultureIgnoreCase))
                            {
                                curDir = curDir.Substring(0, curDir.LastIndexOf('\\'));
                                curDir = curDir.Substring(0, curDir.LastIndexOf('\\') + 1);
                                options.WorkingDirectory = curDir;
                            }
                        }
                        else if (string.IsNullOrEmpty(dirStr) || dirStr.Equals("."))
                        {
                            continue;
                        }
                        else
                        {
                            string dir    = "/C \"cd \"" + curDir + "\" & " + "cd \"" + dirStr + "\"\"";
                            var    result = await ProcessLauncher.RunToCompletionAsync(CommandLineProcesserExe, dir, options);

                            if (result.ExitCode == 0)
                            {
                                curDir += dirStr + "\\";
                                options.WorkingDirectory = curDir;
                            }
                            else
                            {
                                return(CdResult.DirNotFound);
                            }
                        }
                    }
                    currentDirectory = curDir;
                    return(CdResult.Succeed);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            else if (strCmd.Equals("cd", StringComparison.CurrentCultureIgnoreCase))
            {
                currentDirectory = "C:\\";
                return(CdResult.Succeed);
            }

            return(CdResult.NotCdCommand);
        }
        /// <summary>
        /// Runs a process.
        /// </summary>
        /// <param name="fileName">Name of the file.</param>
        /// <param name="arguments">The arguments.</param>
        /// <param name="workingDirectory">The working directory.</param>
        public async Task StartProcessAsync(string fileName, string arguments, string workingDirectory = null)
        {
            //  Are we showing diagnostics?
            if (ShowDiagnostics)
            {
                await WriteOutputAsync("Preparing to run " + fileName, Color.FromArgb(255, 0, 255, 0));

                if (!string.IsNullOrEmpty(arguments))
                {
                    await WriteOutputAsync(" with arguments " + arguments + "." + Environment.NewLine, Color.FromArgb(255, 0, 255, 0));
                }
                else
                {
                    await WriteOutputAsync("." + Environment.NewLine, Color.FromArgb(255, 0, 255, 0));
                }
            }


            await CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
            {
                try
                {
                    var result = await ProcessLauncher.RunToCompletionAsync(
                        fileName,
                        arguments,
                        new ProcessLauncherOptions
                    {
                        WorkingDirectory = workingDirectory,
                        StandardOutput   = OutputStream,
                        StandardError    = ErrorStream
                    });

                    using (var outStreamRedirect = OutputStream.GetInputStreamAt(0))
                    {
                        var size = OutputStream.Size;
                        using (var dataReader = new DataReader(outStreamRedirect))
                        {
                            var bytesLoaded = await dataReader.LoadAsync((uint)size);
                            var stringRead  = dataReader.ReadString(bytesLoaded);
                            await WriteOutputAsync(stringRead, Colors.White);
                        }
                    }

                    using (var errStreamRedirect = ErrorStream.GetInputStreamAt(0))
                    {
                        using (var dataReader = new DataReader(errStreamRedirect))
                        {
                            var size        = ErrorStream.Size;
                            var bytesLoaded = await dataReader.LoadAsync((uint)size);
                            var stringRead  = dataReader.ReadString(bytesLoaded);
                            await WriteOutputAsync(stringRead, Colors.Red);
                        }
                    }
                }
                catch (UnauthorizedAccessException uex)
                {
                    await WriteOutputAsync($"Exception Thrown: {uex.Message}{Environment.NewLine}", Colors.Red);
                    await WriteOutputAsync($"Make sure you're allowed to run the specified exe; either{Environment.NewLine}" +
                                           $"\t1) Add the exe to the AppX package, or{Environment.NewLine}" +
                                           $"\t2) Add the absolute path of the exe to the allow list:{Environment.NewLine}" +
                                           $"\t\tHKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\EmbeddedMode\\ProcessLauncherAllowedExecutableFilesList.{Environment.NewLine}{Environment.NewLine}" +
                                           $"Also, make sure the <iot:Capability Name=\"systemManagement\" /> has been added to the AppX manifest capabilities.{Environment.NewLine}", Colors.Red);
                }
                catch (Exception ex)
                {
                    await WriteOutputAsync($"Exception Thrown: {ex.Message}{Environment.NewLine}", Colors.Red);
                    await WriteOutputAsync($"{ex.StackTrace}{Environment.NewLine}", Colors.Red);
                }
            });
        }