使用C#为

时间:2018-02-23 08:18:16

标签: c# c#-4.0

我在任务调度程序中需要一个解决方案,所创建的任务应该为登录到工作站的所有用户运行,与创建它的方式无关。

我使用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();
        }    

1 个答案:

答案 0 :(得分:0)

使用RegisterTaskDefinition

时,请传递正确的用户凭据
ts.RootFolder.RegisterTaskDefinition(taskName, td, TaskCreation.CreateOrUpdate, "UserId", "Password", TaskLogonType.Password);

您也可以删除此行

td.Principal.LogonType = TaskLogonType.InteractiveToken;