Throw UnauthorizedAccessException when encountering admin issue

This commit is contained in:
Jack251970 2025-05-23 13:20:36 +08:00
parent d6462f4fdc
commit 479b49db94

View file

@ -61,21 +61,45 @@ public class AutoStartup
{ {
try try
{ {
// Check if the action is the same as the current executable path
// If not, we need to unschedule and reschedule the task
if (task.Definition.Actions.FirstOrDefault() is Microsoft.Win32.TaskScheduler.Action taskAction) if (task.Definition.Actions.FirstOrDefault() is Microsoft.Win32.TaskScheduler.Action taskAction)
{ {
var action = taskAction.ToString().Trim(); var action = taskAction.ToString().Trim();
if (!action.Equals(Constant.ExecutablePath, StringComparison.OrdinalIgnoreCase) || // Path issue var pathCorrect = action.Equals(Constant.ExecutablePath, StringComparison.OrdinalIgnoreCase);
!CheckRunLevel(task.Definition.Principal, alwaysRunAsAdministrator)) // Run level issue var runLevelCorrect = CheckRunLevel(task.Definition.Principal.RunLevel, alwaysRunAsAdministrator);
if (_isAdministrator)
{ {
UnscheduleLogonTask(); // If path or run level is not correct, we need to unschedule and reschedule the task
ScheduleLogonTask(alwaysRunAsAdministrator); if (!pathCorrect || !runLevelCorrect)
{
UnscheduleLogonTask();
ScheduleLogonTask(alwaysRunAsAdministrator);
}
}
else
{
// If run level is not correct, we cannot edit it because we are not administrator
if (!runLevelCorrect)
{
throw new UnauthorizedAccessException("Cannot edit task run level because the app is not running as administrator.");
}
// If run level is correct and path is not correct, we need to unschedule and reschedule the task
if (!pathCorrect)
{
UnscheduleLogonTask();
ScheduleLogonTask(alwaysRunAsAdministrator);
}
} }
} }
return true; return true;
} }
catch (UnauthorizedAccessException e)
{
App.API.LogError(ClassName, $"Failed to check logon task: {e}");
throw; // Throw exception so that App.AutoStartup can show error message
}
catch (Exception e) catch (Exception e)
{ {
App.API.LogError(ClassName, $"Failed to check logon task: {e}"); App.API.LogError(ClassName, $"Failed to check logon task: {e}");
@ -86,9 +110,9 @@ public class AutoStartup
return false; return false;
} }
private static bool CheckRunLevel(TaskPrincipal tp, bool alwaysRunAsAdministrator) private static bool CheckRunLevel(TaskRunLevel rl, bool alwaysRunAsAdministrator)
{ {
return alwaysRunAsAdministrator ? tp.RunLevel == TaskRunLevel.Highest : tp.RunLevel != TaskRunLevel.Highest; return alwaysRunAsAdministrator ? rl == TaskRunLevel.Highest : rl != TaskRunLevel.Highest;
} }
private static bool CheckRegistry() private static bool CheckRegistry()