1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Robert 0b6bf5685e Core - Fixed crash on startup if workshop folder is missing
Updating - Properly delay auto-update check until the UI shows,
2024-02-17 15:01:18 +01:00

135 lines
5.1 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using Artemis.Core;
using Artemis.UI.Shared.Providers;
using Avalonia.Platform;
namespace Artemis.UI.Windows.Providers;
public class AutoRunProvider : IAutoRunProvider
{
private readonly string _autorunName = $"Artemis 2 autorun {Environment.UserName}";
private readonly string _oldAutorunName = "Artemis 2 autorun";
private async Task<bool> IsAutoRunTaskCreated(string autorunName)
{
Process schtasks = new()
{
StartInfo =
{
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = true,
FileName = Path.Combine(Environment.SystemDirectory, "schtasks.exe"),
Arguments = $"/TN \"{autorunName}\""
}
};
schtasks.Start();
await schtasks.WaitForExitAsync();
return schtasks.ExitCode == 0;
}
private async Task CreateAutoRunTask(TimeSpan autoRunDelay, string autorunName)
{
await using Stream taskFile = AssetLoader.Open(new Uri("avares://Artemis.UI.Windows/Assets/autorun.xml"));
XDocument document = await XDocument.LoadAsync(taskFile, LoadOptions.None, CancellationToken.None);
XElement task = document.Descendants().First();
task.Descendants().First(d => d.Name.LocalName == "RegistrationInfo").Descendants().First(d => d.Name.LocalName == "Date")
.SetValue(DateTime.Now);
task.Descendants().First(d => d.Name.LocalName == "RegistrationInfo").Descendants().First(d => d.Name.LocalName == "Author")
.SetValue(WindowsIdentity.GetCurrent().Name);
task.Descendants().First(d => d.Name.LocalName == "Triggers").Descendants().First(d => d.Name.LocalName == "LogonTrigger").Descendants().First(d => d.Name.LocalName == "Delay")
.SetValue(autoRunDelay);
task.Descendants().First(d => d.Name.LocalName == "Triggers").Descendants().First(d => d.Name.LocalName == "LogonTrigger").Descendants().First(d => d.Name.LocalName == "UserId")
.SetValue(WindowsIdentity.GetCurrent().Name);
task.Descendants().First(d => d.Name.LocalName == "Principals").Descendants().First(d => d.Name.LocalName == "Principal").Descendants().First(d => d.Name.LocalName == "UserId")
.SetValue(WindowsIdentity.GetCurrent().User!.Value);
task.Descendants().First(d => d.Name.LocalName == "Actions").Descendants().First(d => d.Name.LocalName == "Exec").Descendants().First(d => d.Name.LocalName == "WorkingDirectory")
.SetValue(Constants.ApplicationFolder);
task.Descendants().First(d => d.Name.LocalName == "Actions").Descendants().First(d => d.Name.LocalName == "Exec").Descendants().First(d => d.Name.LocalName == "Command")
.SetValue("\"" + Constants.ExecutablePath + "\"");
string xmlPath = Path.GetTempFileName();
await using (Stream fileStream = new FileStream(xmlPath, FileMode.Create))
{
await document.SaveAsync(fileStream, SaveOptions.None, CancellationToken.None);
}
Process schtasks = new()
{
StartInfo =
{
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = true,
Verb = "runas",
FileName = Path.Combine(Environment.SystemDirectory, "schtasks.exe"),
Arguments = $"/Create /XML \"{xmlPath}\" /tn \"{autorunName}\" /F"
}
};
schtasks.Start();
await schtasks.WaitForExitAsync();
File.Delete(xmlPath);
}
private async Task RemoveAutoRunTask(string autorunName)
{
Process schtasks = new()
{
StartInfo =
{
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = true,
Verb = "runas",
FileName = Path.Combine(Environment.SystemDirectory, "schtasks.exe"),
Arguments = $"/Delete /TN \"{autorunName}\" /f"
}
};
schtasks.Start();
await schtasks.WaitForExitAsync();
}
/// <inheritdoc />
public async Task EnableAutoRun(bool recreate, int autoRunDelay)
{
if (Constants.CurrentVersion == "local")
return;
await CleanupOldAutorun();
// Create or remove the task if necessary
bool taskCreated = false;
if (!recreate)
taskCreated = await IsAutoRunTaskCreated(_autorunName);
if (!taskCreated)
await CreateAutoRunTask(TimeSpan.FromSeconds(autoRunDelay), _autorunName);
}
/// <inheritdoc />
public async Task DisableAutoRun()
{
bool taskCreated = await IsAutoRunTaskCreated(_autorunName);
if (taskCreated)
await RemoveAutoRunTask(_autorunName);
}
private async Task CleanupOldAutorun()
{
bool taskCreated = await IsAutoRunTaskCreated(_oldAutorunName);
if (taskCreated)
await RemoveAutoRunTask(_oldAutorunName);
}
}