从ASP.net运行Windows计划任务

时间:2013-05-03 14:10:20

标签: c# asp.net iis scheduled-tasks windows-server-2003

我有一个Windows计划任务,每小时运行一次数据库导入过程,但我希望用户能够通过点击ASP.net仪表板中的按钮(在IIS6中运行)将其打开。在Windows Server 2003上。)

以下在代码隐藏中完美运行......

var proc = new Process
            {
                StartInfo =
                    {
                        UseShellExecute = false,
                        FileName = @"C:\Windows\System32\schtasks.exe",
                        Arguments = "/run /tn Loader",
                        RedirectStandardError = true,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true
                    }
            };
proc.Start();
proc.WaitForExit();

...但仅当应用程序池标识设置为本地系统时(不理想!)。如果我将其保留为网络服务,则任务无法启动。所以它可能是一个权限问题。

ASP.net是否可以在服务器上启动计划任务而无需将应用程序作为本地系统运行?如果没有,有什么好的替代品?

更新:如果SO上没有人知道,我想这是不可能的,所以我会想到让我的Web应用程序将请求写入数据库表(加倍作为审计日志)和创建第二个任务来轮询该表并启动主要任务。

4 个答案:

答案 0 :(得分:3)

更新您的计划任务以触发特定事件。然后让您的网站在单击按钮时记录该事件 - 从而开始计划任务。

例: 在我的安装程序中,我为我的程序创建了一个事件日志源,因为创建源需要管理权限(you can also use the command line to create the source

  if (EventLog.SourceExists("MyApp"))
  {
      EventLog.CreateEventSource("MyApp", "Application");
  }

然后在我的应用程序中,我在单击按钮时创建一个事件日志条目。

private void btnOpenOtherApp_Click (object sender, EventArgs e) 
{
    try 
    {
        var log = new EventLog
        {
            Source = "MyApp"
        };
        log.WriteEntry("Start MyOtherApp", EventLogEntryType.Information, 1337);
    } 
    catch (Exception ex) 
    {
        ...   
    }
}

任务计划程序设置为在记录事件时打开MyOtherApp。 Event viewer

答案 1 :(得分:1)

您需要Windows中的管理员用户。此代码将帮助您调用任务:

var securePass = new System.Security.SecureString();
foreach (char c in "my_password")
{
    pass.AppendChar(c);
}

var proc = new Process
{
    StartInfo =
    {
        UseShellExecute = false,
        FileName = @"C:\Windows\System32\schtasks.exe",
        Arguments = "/run /tn Loader",
        UserName = "myAdminUser", //NEW
        Password = securePass, //NEW
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};
proc.Start();
proc.WaitForExit();

如果您的应用程序需要以SYSTEM帐户身份运行,您可以使用以下参数:

  

如果/ RU用户名和/ RP密码参数与当前匹配   登录用户,该任务将以交互方式运行(在   前景)。

     

对于系统帐户,/ RU用户名可以写为“”,“NT   AUTHORITY \ SYSTEM“或”SYSTEM“,不需要密码。系统   帐户具有对本地计算机的完全访问权限,但没有权限   网络中的任何其他计算机(或映射驱动器)。

来源:http://ss64.com/nt/schtasks.html

答案 2 :(得分:0)

您可以利用ASP.NET的缓存来运行计划任务。我亲自使用它,它的功效就像魅力一样。当然它有一些限制(准确性),但你可以调整/改变。

http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

此致

答案 3 :(得分:0)

如果使用第三方调度程序服务(例如Quartz.NET)不是一个选项,并且也不允许更改权限(在任何情况下都不是一个好主意)另一种可能性是将帮助程序Windows服务编写为ASP.NET应用程序和Windows调度程序之间的桥梁。您可以在DB中存储任务列表,事件序列如下:

  1. 当您需要运行任务时,在ASP.NET GUI中为数据库中的该任务设置标志
  2. 帮助程序服务按计划运行,以给定的时间间隔检查数据库 - 查看标志,启动任务,重置标志。
  3. 哦,还有那些包含Window Task Scheduler的库(例如http://taskscheduler.codeplex.com/和其他),所以你不必直接执行它们,而是以一种很好的管理方式执行它们。