Ejemplo n.º 1
0
        public TokenSwitchRenderer(Connection connection, ElevationRequest elevationRequest)
        {
            if (Settings.SecurityEnforceUacIsolation && !elevationRequest.NewWindow)
            {
                throw new Exception("TokenSwitch mode not supported when SecurityEnforceUacIsolation is set.");
            }

            _connection       = connection;
            _elevationRequest = elevationRequest;
            Environment.SetEnvironmentVariable("prompt", Environment.ExpandEnvironmentVariables(elevationRequest.Prompt));

            ProcessApi.CreateProcessFlags dwCreationFlags = ProcessApi.CreateProcessFlags.CREATE_SUSPENDED;

            if (elevationRequest.NewWindow)
            {
                dwCreationFlags |= ProcessApi.CreateProcessFlags.CREATE_NEW_CONSOLE;
            }

            string exeName, args;

            if (elevationRequest.IntegrityLevel == IntegrityLevel.MediumPlus &&
                ArgumentsHelper.UnQuote(elevationRequest.FileName.ToUpperInvariant()) != Environment.GetEnvironmentVariable("COMSPEC").ToUpperInvariant())
            {
                // Now, we have an issue with this method: The process launched with the new token throws Access Denied if it tries to read its own token.
                // Kind of dirty workaround is to wrap the call with a "CMD.exe /c ".. this intermediate process will then
                // launching the command with a fresh new (desired) token and we know cmd wont try to read it's substitute token (throwing Access Denied).

                exeName = Environment.GetEnvironmentVariable("COMSPEC");
                args    = $"/s /c \"{elevationRequest.FileName} {elevationRequest.Arguments}\"";
            }
            else
            {
                // Hack not needed if we are already calling CMD
                exeName = elevationRequest.FileName;
                args    = elevationRequest.Arguments;
            }

            _process = ProcessFactory.CreateProcessAsUserWithFlags(exeName, args, dwCreationFlags, out _processInformation);

            elevationRequest.TargetProcessId = _processInformation.dwProcessId;
            if (!elevationRequest.NewWindow)
            {
                ConsoleApi.SetConsoleCtrlHandler(ConsoleHelper.IgnoreConsoleCancelKeyPress, true);
            }
        }
Ejemplo n.º 2
0
        public Task <int> Execute()
        {
            RegistrySetting setting = null;

            if (key == null)
            {
                foreach (var k in GlobalSettings.AllKeys)
                {
                    Console.WriteLine($"{k.Value.Name} = \"{ k.Value.GetStringValue().ToString()}\"");
                }

                return(Task.FromResult(0));
            }

            GlobalSettings.AllKeys.TryGetValue(key, out setting);

            if (setting == null)
            {
                Console.WriteLine($"Invalid Setting '{key}'.", LogLevel.Error);
                return(Task.FromResult(Constants.GSUDO_ERROR_EXITCODE));
            }

            if (value != null && value.Any())
            {
                if (value.FirstOrDefault().In("--reset"))
                {
                    setting.Reset(); // reset to default value
                }
                else if (value.Count() == 1)
                {
                    setting.Save(ArgumentsHelper.UnQuote(value.FirstOrDefault()).Replace("\\%", "%"));
                }
                else
                {
                    setting.Save(string.Join(" ", value.ToArray()));
                }
            }

            // READ
            Console.WriteLine($"{setting.Name} = \"{ setting.GetStringValue().ToString()}\"");
            return(Task.FromResult(0));
        }
Ejemplo n.º 3
0
        public Task <int> Execute()
        {
            RegistrySetting setting = null;

            if (key == null)
            {
                // print all configs
                foreach (var k in Settings.AllKeys)
                {
                    Console.WriteLine($"{k.Value.Name} = \"{ k.Value.GetStringValue().ToString()}\"".PadRight(50) + (k.Value.HasGlobalValue() ? "(global)" : (k.Value.HasLocalValue() ? "(user)" : string.Empty)));
                }

                return(Task.FromResult(0));
            }

            Settings.AllKeys.TryGetValue(key, out setting);

            if (setting == null)
            {
                Logger.Instance.Log($"Invalid Setting '{key}'.", LogLevel.Error);
                return(Task.FromResult(Constants.GSUDO_ERROR_EXITCODE));
            }

            if (value != null && value.Any())
            {
                if (value.Any(v => v.In("--global")))
                {
                    InputArguments.Global = true;
                    value = value.Where(v => !v.In("--global"));
                }

                bool reset = value.Any(v => v.In("--reset"));
                value = value.Where(v => !v.In("--reset"));

                string unescapedValue =
                    (value.Count() == 1)
                    ? ArgumentsHelper.UnQuote(value.FirstOrDefault()).Replace("\\%", "%")
                    : string.Join(" ", value.ToArray());

                if (!reset)
                {
                    _ = setting.Parse(unescapedValue);
                }

                if (!InputArguments.Global && setting.Scope == RegistrySettingScope.GlobalOnly)
                {
                    Logger.Instance.Log($"Config Setting for '{setting.Name}' will be set as global system setting.", LogLevel.Info);
                    InputArguments.Global = true;
                }

                if (InputArguments.Global && !ProcessHelper.IsAdministrator())
                {
                    Logger.Instance.Log($"Global system settings requires elevation. Elevating...", LogLevel.Info);
                    return(new RunCommand()
                    {
                        CommandToRun = new string[]
                        { $"\"{ProcessHelper.GetOwnExeName()}\"", "--global", "config", key, reset ? "--reset" : $"\"{unescapedValue}\"" }
                    }.Execute());
                }

                if (reset)
                {
                    setting.Reset(InputArguments.Global); // reset to default value
                }
                else
                {
                    setting.Save(unescapedValue, InputArguments.Global);
                }

                if (setting.Name == Settings.CacheDuration.Name)
                {
                    new KillCacheCommand().Execute();
                }
            }

            // READ
            setting.ClearRunningValue();
            Console.WriteLine($"{setting.Name} = \"{ setting.GetStringValue().ToString()}\" {(setting.HasGlobalValue() ? "(global)" : (setting.HasLocalValue() ? "(user)" : "(default)"))}");
            return(Task.FromResult(0));
        }