繁体   English   中英

从ASP.net运行Windows计划任务

[英]Running a Windows Scheduled Task from ASP.net

我有一个Windows计划任务,每小时运行一次数据库导入过程,但我希望用户能够通过点击ASP.net仪表板中的按钮(在Windows Server上的IIS6中运行)将其打开。 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应用程序将请求写入数据库表(加倍作为审计日志)并创建第二个任务来轮询该表并踢关闭主要任务。

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

例如:在我的安装程序中,我为我的程序创建了一个事件日志源,因为创建源需要管理权限( 您也可以使用命令行创建源

  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。 事件查看器

您需要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

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

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

问候

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

  1. 当您需要运行任务时,从ASP.NET GUI中为该任务在DB中设置标志
  2. 帮助程序服务按计划运行,以给定的时间间隔检查数据库 - 查看标志,启动任务,重置标志。

哦,还有那些包含Window Task Scheduler的库(例如http://taskscheduler.codeplex.com/和其他),所以你不必直接执行它们,而是以一种很好的管理方式执行它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM