从ASP.net运行Windows计划任务

Chr*_*ris 6 c# asp.net iis scheduled-tasks windows-server-2003

我有一个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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

bas*_*her 5

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

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

  if (EventLog.SourceExists("MyApp"))
  {
      EventLog.CreateEventSource("MyApp", "Application");
  }
Run Code Online (Sandbox Code Playgroud)

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

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) 
    {
        ...   
    }
}
Run Code Online (Sandbox Code Playgroud)

并且任务调度程序设置为在记录事件时打开 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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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