从运行一个ASP.net Windows计划任务

问题描述 投票:5回答:4

我有一个运行每隔一小时一个数据库导入过程的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揭开序幕服务器上的计划任务不运行应用程序作为本地系统?如果不是,有什么好的替代品有哪些?

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

c# asp.net iis scheduled-tasks windows-server-2003
4个回答
4
投票

更新您的计划任务触发关闭特定事件。然后让你的网站登录时,该按钮被点击的事件 - 从此开始你的计划任务。

例如:在我安装我创建一个事件日志来源为我的计划,因为创建源需要管理员权限(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。


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();

如果您的应用程序需要为系统帐户运行,你可以使用这个参数:

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

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

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


0
投票

你可以利用ASP.NET的缓存来运行计划任务。我个人用这个和它的工作般的魅力。 Ofcourse它有一定的局限性(精度),但你可以调整/改变。

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

问候


0
投票

如果使用第三方调度服务,例如Quartz.NET不是一个选项,更改权限不允许或者(无论如何也不是一个好主意),另一种可能性是写一个辅助的Windows服务为ASP.NET应用程序之间的桥梁Windows计划。你将存储的任务列表中的一个DB和事件的顺序是这样的:

  1. 当你需要运行任务,从ASP.NET GUI您为任务设置标志在DB
  2. Helper服务如期运行,检查DB在给定的时间间隔 - 看到标志,启动任务,重置标志。

哦,这儿有图书馆在那里(例如http://taskscheduler.codeplex.com/和其他)包装窗口任务计划程序,所以你不必直接执行它们,而是在一个不错的方式管理。

© www.soinside.com 2019 - 2024. All rights reserved.