我在任务调度程序中需要一个解决方案,所创建的任务应该为登录到工作站的所有用户运行,与创建它的方式无关。
我使用C#编写了一个控制台应用程序,用于在任务计划程序中创建任务。
说,在积极的情况下 当用户运行控制台应用程序时,它会创建一个任务,任务原则用户ID将是他的用户名。因此,用户可以运行该任务,因为他是所有者。
在负面情景中说 当用户将控制台应用程序作为“以管理员身份运行”运行时,使用不同的凭据,例如Myadmin,然后创建任务,但使用主要用户ID作为admin的id而不是登录用户。
现在出现了问题。关闭所有内容并尝试运行任务后,它将无法运行,因为所有者/原则ID不同。
我需要一个解决方案,因为任务将由管理员创建,登录该计算机的所有用户都应该收到与创建/所有者无关的通知。
这是我的代码。
using Microsoft.Win32.TaskScheduler;
static readonly string taskName = "Hello World";
static void Main(string[] args)
{
try
{
Console.WriteLine("Creating scheduler");
using (TaskService ts = new TaskService())
{
TaskDefinition td = ts.NewTask();
td.Data = "Hello World Notification";
td.Principal.LogonType = TaskLogonType.InteractiveToken;
td.RegistrationInfo.Description = "Hello World";
td.RegistrationInfo.Documentation = "Auto notification Hello World";
td.Settings.DisallowStartIfOnBatteries = false;
td.Settings.Priority = System.Diagnostics.ProcessPriorityClass.Normal;
td.Settings.RunOnlyIfNetworkAvailable = true;
td.Settings.StopIfGoingOnBatteries = false;
td.Settings.MultipleInstances = TaskInstancesPolicy.StopExisting;
td.Settings.StartWhenAvailable = true;
td.Triggers.Add(new DailyTrigger(1));
td.Triggers[0].StartBoundary = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 12, 0, 1);
td.Actions.Add(new ExecAction(Environment.CurrentDirectory + "\\Earth.exe", ""));
// Register the task in the root folder
ts.RootFolder.RegisterTaskDefinition(taskName, td);
}
Console.WriteLine("Success");
}
catch (Exception ex)
{
Console.WriteLine("Error while creating schedular");
Console.WriteLine(ex.Message);
Console.WriteLine("**********************");
Console.WriteLine("PRESS ANY KEY TO EXIT");
Console.ReadLine();
}
答案 0 :(得分:0)
使用RegisterTaskDefinition
ts.RootFolder.RegisterTaskDefinition(taskName, td, TaskCreation.CreateOrUpdate, "UserId", "Password", TaskLogonType.Password);
您也可以删除此行
td.Principal.LogonType = TaskLogonType.InteractiveToken;