From ab6f5c21c81cd11d8b679961ee1b160ff1d47ad4 Mon Sep 17 00:00:00 2001
From: 2dust <31833384+2dust@users.noreply.github.com>
Date: Wed, 4 Jan 2023 17:17:43 +0800
Subject: [PATCH] Auto Start via TaskService
---
v2rayN/v2rayN/Tool/Utils.cs | 55 ++++++++++++++++++++++++++++++++++++-
1 file changed, 54 insertions(+), 1 deletion(-)
diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs
index 318eb2c7..b5824ea0 100644
--- a/v2rayN/v2rayN/Tool/Utils.cs
+++ b/v2rayN/v2rayN/Tool/Utils.cs
@@ -1,4 +1,5 @@
using Microsoft.Win32;
+using Microsoft.Win32.TaskScheduler;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
@@ -601,11 +602,22 @@ namespace v2rayN
//delete first
RegWriteValue(Global.AutoRunRegPath, autoRunName, "");
+ if (IsAdministrator())
+ {
+ AutoStart(autoRunName, "", "");
+ }
if (run)
{
string exePath = $"\"{GetExePath()}\"";
- RegWriteValue(Global.AutoRunRegPath, autoRunName, exePath);
+ if (IsAdministrator())
+ {
+ AutoStart(autoRunName, exePath, "");
+ }
+ else
+ {
+ RegWriteValue(Global.AutoRunRegPath, autoRunName, exePath);
+ }
}
}
catch (Exception ex)
@@ -740,6 +752,47 @@ namespace v2rayN
return false;
}
}
+
+ ///
+ /// Auto Start via TaskService
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static void AutoStart(string taskName, string fileName, string description)
+ {
+ if (string.IsNullOrEmpty(taskName))
+ {
+ return;
+ }
+ string TaskName = taskName;
+ var logonUser = WindowsIdentity.GetCurrent().Name;
+ string taskDescription = description;
+ string deamonFileName = fileName;
+
+ using (var taskService = new TaskService())
+ {
+ var tasks = taskService.RootFolder.GetTasks(new Regex(TaskName));
+ foreach (var t in tasks)
+ {
+ taskService.RootFolder.DeleteTask(t.Name);
+ }
+ if (string.IsNullOrEmpty(fileName))
+ {
+ return;
+ }
+
+ var task = taskService.NewTask();
+ task.RegistrationInfo.Description = taskDescription;
+ task.Settings.DisallowStartIfOnBatteries = false;
+ task.Triggers.Add(new LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromMinutes(1) });
+ task.Principal.RunLevel = TaskRunLevel.Highest;
+ task.Actions.Add(new ExecAction(deamonFileName));
+
+ taskService.RootFolder.RegisterTaskDefinition(TaskName, task);
+ }
+ }
#endregion