我有一个运行每隔一小时一个数据库导入过程的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应用程序写入请求到数据库表(作为审计日志加倍),并创建第二个任务的想法去查询该表和踢关的主要任务。
更新您的计划任务触发关闭特定事件。然后让你的网站登录时,该按钮被点击的事件 - 从此开始你的计划任务。
例如:在我安装我创建一个事件日志来源为我的计划,因为创建源需要管理员权限(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。
如何在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”,不需要密码。该系统帐户具有完全访问本地计算机,但对整个网络中的任何其他机器(或映射驱动器)没有权限。
你可以利用ASP.NET的缓存来运行计划任务。我个人用这个和它的工作般的魅力。 Ofcourse它有一定的局限性(精度),但你可以调整/改变。
http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
问候
如果使用第三方调度服务,例如Quartz.NET不是一个选项,更改权限不允许或者(无论如何也不是一个好主意),另一种可能性是写一个辅助的Windows服务为ASP.NET应用程序之间的桥梁Windows计划。你将存储的任务列表中的一个DB和事件的顺序是这样的:
哦,这儿有图书馆在那里(例如http://taskscheduler.codeplex.com/和其他)包装窗口任务计划程序,所以你不必直接执行它们,而是在一个不错的方式管理。