public void RunAsDifferentUser_ShouldWork(string command, string arguments)
        {
            var user = new TestUserPrincipal(Username);

            using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));

            // Target the CommonApplicationData folder since this is a place the particular user can get to
            var workingDirectory           = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
            var networkCredential          = user.GetCredential();
            var customEnvironmentVariables = new Dictionary <string, string>();

            var exitCode = Execute(command,
                                   arguments,
                                   workingDirectory,
                                   out var debugMessages,
                                   out var infoMessages,
                                   out var errorMessages,
                                   networkCredential,
                                   customEnvironmentVariables,
                                   cts.Token);

            exitCode.Should().Be(0, "the process should have run to completion");
            errorMessages.ToString().Should().BeEmpty("no messages should be written to stderr");
            infoMessages.ToString().Should().ContainEquivalentOf($@"{user.DomainName}\{user.UserName}");
        }
        public void RunningAsDifferentUser_ShouldWorkLotsOfTimes()
        {
            var user = new TestUserPrincipal(Username);

            using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(120));

            for (var i = 0; i < 20; i++)
            {
                var arguments = $"{CommandParam} \"echo {EchoEnvironmentVariable("customenvironmentvariable")}%\"";
                // Target the CommonApplicationData folder since this is a place the particular user can get to
                var workingDirectory           = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
                var networkCredential          = user.GetCredential();
                var customEnvironmentVariables = new Dictionary <string, string>
                {
                    { "customenvironmentvariable", $"customvalue-{i}" }
                };

                var exitCode = Execute(Command,
                                       arguments,
                                       workingDirectory,
                                       out var debugMessages,
                                       out var infoMessages,
                                       out var errorMessages,
                                       networkCredential,
                                       customEnvironmentVariables,
                                       cts.Token);

                exitCode.Should().Be(0, "the process should have run to completion");
                infoMessages.ToString().Should().ContainEquivalentOf($"customvalue-{i}", "the environment variable should have been copied to the child process");
                errorMessages.ToString().Should().BeEmpty("no messages should be written to stderr");
            }
        }
        public void RunningAsDifferentUser_CanWriteToItsOwnTempPath()
        {
            var user = new TestUserPrincipal(Username);

            using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
            {
                var arguments = $"{CommandParam} \"echo hello > %temp%hello.txt\"";
                // Target the CommonApplicationData folder since this is a place the particular user can get to
                var workingDirectory           = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
                var networkCredential          = user.GetCredential();
                var customEnvironmentVariables = new Dictionary <string, string>();

                var exitCode = Execute(Command,
                                       arguments,
                                       workingDirectory,
                                       out var debugMessages,
                                       out var infoMessages,
                                       out var errorMessages,
                                       networkCredential,
                                       customEnvironmentVariables,
                                       cts.Token);

                exitCode.Should().Be(0, "the process should have run to completion after writing to the temp folder for the other user");
                errorMessages.ToString().Should().BeEmpty("no messages should be written to stderr");
            }
        }
        public void DebugLogging_ShouldContainDiagnosticsInfo_DifferentUser()
        {
            var user = new TestUserPrincipal(Username);

            using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));

            var arguments = $"{CommandParam} \"echo %userdomain%\\%username%\"";
            // Target the CommonApplicationData folder since this is a place the particular user can get to
            var workingDirectory           = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
            var networkCredential          = user.GetCredential();
            var customEnvironmentVariables = new Dictionary <string, string>();

            var exitCode = Execute(Command,
                                   arguments,
                                   workingDirectory,
                                   out var debugMessages,
                                   out var infoMessages,
                                   out var errorMessages,
                                   networkCredential,
                                   customEnvironmentVariables,
                                   cts.Token);

            exitCode.Should().Be(0, "the process should have run to completion");
            debugMessages.ToString()
            .Should()
            .ContainEquivalentOf(Command, "the command should be logged")
            .And.ContainEquivalentOf($@"{user.DomainName}\{user.UserName}", "the custom user details should be logged")
            .And.ContainEquivalentOf(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "the working directory should be logged");
            infoMessages.ToString().Should().ContainEquivalentOf($@"{user.DomainName}\{user.UserName}");
            errorMessages.ToString().Should().BeEmpty("no messages should be written to stderr");
        }