diff --git a/src/runner/main.cpp b/src/runner/main.cpp index 6b2db856cb..2a072caeaf 100644 --- a/src/runner/main.cpp +++ b/src/runner/main.cpp @@ -465,6 +465,7 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR l const bool elevated = is_process_elevated(); const bool with_dont_elevate_arg = cmdLine.find("--dont-elevate") != std::string::npos; const bool run_elevated_setting = general_settings.GetNamedBoolean(L"run_elevated", false); + const bool with_restartedElevated_arg = cmdLine.find("--restartedElevated") != std::string::npos; if (elevated && with_dont_elevate_arg && !run_elevated_setting) { @@ -472,8 +473,14 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR l schedule_restart_as_non_elevated(); result = 0; } - else if (elevated || !run_elevated_setting || with_dont_elevate_arg) + else if (elevated || !run_elevated_setting || with_dont_elevate_arg || (!elevated && with_restartedElevated_arg)) { + // The condition (!elevated && with_restartedElevated_arg) solves issue #19307. Restart elevated loop detected, running non-elevated + if (!elevated && with_restartedElevated_arg) + { + Logger::info("Restart as elevated failed. Running non-elevated."); + } + result = runner(elevated, open_settings, settings_window, openOobe, openScoobe); if (result == 0) diff --git a/src/runner/restart_elevated.cpp b/src/runner/restart_elevated.cpp index 13d4b47136..c14b63d479 100644 --- a/src/runner/restart_elevated.cpp +++ b/src/runner/restart_elevated.cpp @@ -42,9 +42,9 @@ bool restart_if_scheduled() switch (state) { case RestartAsElevated: - return run_elevated(exe_path.get(), {}); + return run_elevated(exe_path.get(), L"--restartedElevated"); case RestartAsElevatedOpenSettings: - return run_elevated(exe_path.get(), L"--open-settings"); + return run_elevated(exe_path.get(), L"--restartedElevated --open-settings"); case RestartAsNonElevatedOpenSettings: return run_non_elevated(exe_path.get(), L"--open-settings", NULL); case RestartAsNonElevated: