【发布时间】:2014-07-13 14:49:55
【问题描述】:
我编写了一个小型控制台应用程序,它通过电子邮件将备份的数据库从一台机器移动到另一个位置。
这是如何工作的,SQL 服务器所在的机器我在 SQL 中创建了一个作业,它将特定数据库备份到卷存储中,该卷存储在同一台机器中,但不在同一卷上Server 2008rC 操作系统已开启。
因此,每天晚上大约凌晨 1 点,作业都会运行并将特定数据库备份到我仅用于备份数据库特定项目的卷中。 现在,每天凌晨 2 点左右,我正在运行一个调用我的控制台应用程序的 Windows 任务,这个控制台应用程序是下面的代码,非常简单。它所做的只是检索数据库,将它们全部压缩到一个 zip 文件中,然后将备份的数据库通过电子邮件发送到特定的电子邮件,然后数据库存储在不同的位置,这样我就有了一点冗余。
这是我的问题。
1.) 我应该在存储备份数据库的根文件夹上设置的最小权限是多少,以便 Windows 任务计划程序能够调用我的控制台应用程序,进而调用我的控制台app 会读取、写入和删除。我想要设置最低权限。
2.) 如何通过隐藏控制台窗口来运行控制台应用程序,这样如果管理员登录,当通过该 Windows 任务调度程序调用控制台应用程序时,他们看不到该窗口。现在,我被告知我可以从控制台应用程序将我的应用程序设置为 Windows 窗体,这将解决我的窗口问题,但我的问题是这是否意味着每天凌晨 2 点这将创建一个新窗口和窗户保持活动状态?换句话说,我需要运行这个控制台应用程序,控制台应用程序需要完成它的任务设置,并且我需要控制台应用程序完成消亡,直到 24 小时后凌晨 2 点才运行。
这里是创建 zip 文件、通过电子邮件发送 zip 文件以及删除 zip 文件的所有代码。 我应该采取什么方向?
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
namespace SendDatabaseMail
{
class Program
{
static void Main(string[] args)
{
string supportEmail = System.Configuration.ConfigurationManager.AppSettings["supportemail"],
dataFolder = System.Configuration.ConfigurationManager.AppSettings["datafolder"],
zippedFolder = System.Configuration.ConfigurationManager.AppSettings["zippedfolder"],
zippedfilename = System.Configuration.ConfigurationManager.AppSettings["zippedfilename"],
smtpServer = System.Configuration.ConfigurationManager.AppSettings["smtpserver"],
smtpPort = System.Configuration.ConfigurationManager.AppSettings["smtpport"],
mailSubject = System.Configuration.ConfigurationManager.AppSettings["mailsubject"],
mailBody = System.Configuration.ConfigurationManager.AppSettings["mailbody"],
mailPassword = System.Configuration.ConfigurationManager.AppSettings["mailpassword"],
databasesRepository = System.Configuration.ConfigurationManager.AppSettings["databasesrepository"];
string repositoryPath = databasesRepository + "/" + dataFolder,
zipPath = databasesRepository + "/" + zippedFolder;
if (Directory.GetFiles(repositoryPath).Length > 0)
{
try
{
using (System.Net.Mail.MailMessage mm = new MailMessage(new MailAddress(supportEmail), new MailAddress(supportEmail)))
{
mm.Subject = mailSubject;
mm.Body = mailBody;
ZipFile.CreateFromDirectory(repositoryPath, zipPath + "/" + zippedfilename);
mm.Attachments.Add(new Attachment(zipPath + "/" + zippedfilename));
using (SmtpClient smtp = new SmtpClient(smtpServer, short.Parse(smtpPort)))
{
smtp.Credentials = new System.Net.NetworkCredential(supportEmail, mailPassword);
smtp.EnableSsl = true;
smtp.Send(mm);
}
}
}
catch (Exception ex)
{ }
if (File.Exists(zipPath + "/" + zippedfilename))
{
File.Delete(zipPath + "/" + zippedfilename);
}
}
}
}
}
【问题讨论】:
-
你真的应该使用像 SSIS 和 SQL Server 代理这样的东西来做到这一点。
-
好的,我试试看。
标签: c# console-application .net-4.5 windows-task-scheduler