【问题标题】:How do I create/modify a recurring task in C# using Windows Task Scheduler?如何使用 Windows 任务计划程序在 C# 中创建/修改重复任务?
【发布时间】:2014-08-22 00:10:41
【问题描述】:

我有一个 C# 应用程序,它将在 Task Scheduler 程序中创建重复任务以执行特定程序(根据重复条件发送的触发电子邮件)。

使用 C# 我能够在 Visual Studio 和 IIS Express 中运行应用程序时成功创建任务。看到弹出命令窗口,任务进入成功。

但是,当直接通过 IIS(通过 Web 浏览器)进入程序时,我发现任务调度程序没有任何变化,并且没有显示任何状态信息的命令窗口。

我尝试以管理员身份运行,但无济于事。根据下面的代码,当计划任务不存在时,我需要进行哪些修改才能成功添加计划任务,或者修改已经存在的现有重复计划任务并仅更改重复日期?

这是我到目前为止所做的:

        if (chkActivate.SelectedItem.Text == "Deactivate Reminders")
        {
            chkDaysOfWeek.Enabled = false;
            chkEmailOption.Enabled = false;

            command = "schtasks.exe /Change /TN \"Action Item Reminder\" /Disable";

        }
        else
        {
            chkDaysOfWeek.Enabled = true;
            chkEmailOption.Enabled = true;

            command = "schtasks.exe /Change /TN \"Action Item Reminder\" /Enable";

        }
    List<string> days = new List<string>();

    for (int idx = 0; idx < chkDaysOfWeek.Items.Count; idx++)
    {
        if (chkDaysOfWeek.Items[idx].Selected == true)
        {
            strquery = "UPDATE EmailOption set [Value] = 'true' where [Option] = '" + chkDaysOfWeek.Items[idx].Text.ToString() + "'";
            days.Add(chkDaysOfWeek.Items[idx].Text.Substring(0, 3).ToUpper());
        }
        else
            strquery = "UPDATE EmailOption set [Value] = 'false' where [Option] = '" + chkDaysOfWeek.Items[idx].Text.ToString() + "'";
        SqlCommand cmd = new SqlCommand(strquery, mycon);
        cmd.ExecuteNonQuery();
    }

   // string runascmd = @"schtasks.exe /DELETE /TN ""Action Item Reminder"" /f & schtasks.exe /CREATE /SC WEEKLY /D " + string.Join(",", days) + @" /TN ""Action Item Reminder"" /TR ""C:\ActionAIM_Source\bin\ActionItemReminder.exe"" /ST 00:01 /f & """ + command;
    string runascmd = @"schtasks.exe /CREATE /SC WEEKLY /D " + string.Join(",", days) + @" /TN ""Action Item Reminder"" /TR ""C:\ActionAIM_Source\bin\ActionItemReminder.exe"" /ST 00:01 /f & " + command;

    ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe");
    processInfo.Arguments = @"runas /env /user:Administrator /K """ + runascmd + @"""";
    //processInfo.Verb = "runas";
    processInfo.UseShellExecute = true;

    try
    {
        Process.Start(processInfo);
    }
    catch (Win32Exception ex)
    {
        Response.Write(ex.ToString());   
    }

【问题讨论】:

  • 您是否尝试在运行您的网络应用程序的应用程序池上设置管理凭据?
  • 我已尝试将应用程序池更改为 LocalSystem(目前为当前设置),以及我自己的 Windows 用户帐户。他们都没有做出改变。所以可能代码不是问题。
  • 你能单步调试代码看看会发生什么吗?另外,你看过这个吗? stackoverflow.com/a/4679686/2638872
  • 感谢您的链接。我尝试了启用 IIS Admin Service 与桌面交互的主要建议,但无法生成解决方案。当我只“更改”(意思是启用或禁用)计划任务时,我观察到我的程序正在运行。当我尝试“创建”或“删除”时,程序什么也不做或挂起。这仍然是权限问题吗?

标签: c# asp.net scheduled-tasks


【解决方案1】:

修改代码以使用命令 ProcessStartInfo("schtasks.exe") 而不是 ProcessStartInfo("cmd.exe") 后,我将命令行字符串拆分为两个命令,并将应用程序池设置为本地运行Windows 帐户,我能够创建任务并修改我通过 IIS 成功创建的任务。

        if (chkActivate.SelectedItem.Text == "Deactivate Reminders")
        {
            chkDaysOfWeek.Enabled = false;
            chkEmailOption.Enabled = false;

            command = @"/Change /TN ""Action Item Reminder"" /Disable";

        }
        else
        {
            chkDaysOfWeek.Enabled = true;
            chkEmailOption.Enabled = true;

            command = @"/Change /TN ""Action Item Reminder"" /Enable";

        }
        if (chkEmailOption.SelectedItem.Text == "Original")
        {
            strquery = "UPDATE EmailOption set [Value] = 'true' where [Option] = 'Original Due Date'; UPDATE EmailOption set [Value] = 'false' where [Option] = 'ECD'";
            SqlCommand cmd = new SqlCommand(strquery, mycon);
            cmd.ExecuteNonQuery();
        }
        else if (chkEmailOption.SelectedItem.Text == "ECD")
        {
            strquery = "UPDATE EmailOption set [Value] = 'true' where [Option] = 'ECD'; UPDATE EmailOption set [Value] = 'false' where [Option] = 'Original Due Date'";
            SqlCommand cmd = new SqlCommand(strquery, mycon);
            cmd.ExecuteNonQuery();
        }


        List<string> days = new List<string>();

        for (int idx = 0; idx < chkDaysOfWeek.Items.Count; idx++)
        {
            if (chkDaysOfWeek.Items[idx].Selected == true)
            {
                strquery = "UPDATE EmailOption set [Value] = 'true' where [Option] = '" + chkDaysOfWeek.Items[idx].Text.ToString() + "'";
                days.Add(chkDaysOfWeek.Items[idx].Text.Substring(0, 3).ToUpper());
            }
            else
                strquery = "UPDATE EmailOption set [Value] = 'false' where [Option] = '" + chkDaysOfWeek.Items[idx].Text.ToString() + "'";
            SqlCommand cmd = new SqlCommand(strquery, mycon);
            cmd.ExecuteNonQuery();
        }

        string create = @"/CREATE /SC WEEKLY /D " + string.Join(",", days) + @" /TN ""Action Item Reminder"" /TR ""C:\ActionAIM_Source\bin\ActionItemReminder.exe"" /ST 00:01 /f";
        ProcessStartInfo processInfo = new ProcessStartInfo("schtasks.exe");

        try
        {
            processInfo.Arguments = create;
            var process = Process.Start(processInfo);
            process.WaitForExit(1000);
            processInfo.Arguments = command;
            process = Process.Start(processInfo);
            process.WaitForExit(1000);
        }
       catch (Win32Exception ex)
       {
            Response.Write(ex.ToString());   
       }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2010-10-21
    • 2014-12-28
    • 1970-01-01
    • 2017-01-10
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多