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); } }
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)); }
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)); }