病毒扫描后以编程方式移动文件
Posted
技术标签:
【中文标题】病毒扫描后以编程方式移动文件【英文标题】:Programmatically move files after virus scan 【发布时间】:2011-08-15 21:46:47 【问题描述】:是否可以根据病毒扫描状态以编程方式移动文件?
我想做的是有一组文件夹:
传入 已扫描 扫描/清洁 扫描/感染 未扫描
文件将被放入 Incoming 文件夹。那时,我想启动防病毒软件并扫描 Incoming 文件夹中的文件。完成后,需要将文件移动到适当的文件夹,无论是 Clean 还是 Infected。如果由于某种原因无法扫描文件或扫描时遇到问题,则会将其移至 Not Scanned 文件夹。
我希望有一种方法可以编写脚本。以前有人做过这样的事吗?
【问题讨论】:
当然,有可能。一切皆有可能。但这是一个相当广泛的问题,您没有指定您使用的是哪种 AV,甚至没有说明您正在运行什么环境,因此您不太可能得到任何有用的答案。 此时......任何事情。我不关心防病毒软件,它是一个简单的 Windows 环境。这些文件通过 POST 拖放到 Windows Server 2003 服务器上。如果我必须下载免费的防病毒软件,我会的。作为记录,服务器运行 Symantec。 这可能是一个超级用户的问题——“哪个 AV 将允许我监控文件夹 X 并将受感染的文件移动到文件夹 Y” 谢谢。我会继续寻找解决这个问题的方法。 【参考方案1】:public void Scan()
string[] uploadPath = Directory.GetFiles(ConfigurationManager.AppSettings["UploadPath"]);
foreach(string filePath in uploadPath)
string fileName = Path.GetFileName(filePath);
string cleanPath = Path.Combine(ConfigurationManager.AppSettings["CleanPath"], fileName);
try
Process AV = new Process();
AV.StartInfo.UseShellExecute = false;
AV.StartInfo.RedirectStandardOutput = true;
AV.StartInfo.FileName = ConfigurationManager.AppSettings["VSApp"];
AV.StartInfo.Arguments = " -Scan -ScanType 3 -file " + ConfigurationManager.AppSettings["UploadPath"] + " -DisableRemediation";
AV.Start();
string output = AV.StandardOutput.ReadToEnd();
AV.WaitForExit();
if (AV.ExitCode == 0)
File.Move(filePath, cleanPath);
else if (AV.ExitCode == 2)
using (TextWriter tw = new StreamWriter(ConfigurationManager.AppSettings["FailedPath"] + fileName + ".txt"))
tw.WriteLine("2");
tw.Close();
using (TextWriter tw1 = new StreamWriter(ConfigurationManager.AppSettings["FailedFiles"] + fileName + ".txt"))
tw1.WriteLine(AV.StandardOutput);
tw1.Close();
File.Delete(filePath);
AV.Close();
catch (Exception ex)
if (ex.ToString().Contains("Could not find file"))
string failedFile = ConfigurationManager.AppSettings["FailedPath"] + fileName + ".txt";
string failedFileDesc = ConfigurationManager.AppSettings["FailedPath"] + fileName + "_ErrorDesc" + ".txt";
using (TextWriter tw = new StreamWriter(failedFile))
tw.WriteLine("2");
tw.Close();
using (TextWriter tw1 = new StreamWriter(failedFileDesc))
tw1.WriteLine(ex.ToString());
tw1.Close();
else
Thread.Sleep(2000);
if (runCounter == 0)
Scan();
runCounter++;
string errorFile = ConfigurationManager.AppSettings["ProcessErrorPath"] + fileName + ".txt";
using (TextWriter tw = new StreamWriter(errorFile))
tw.WriteLine(ex.ToString());
tw.Close();
我将其创建为 Windows 服务。我的 OnStart 方法创建了我的 FileSystemWatcher 来监视上传路径。对于 On Created,我有一个方法运行我的 Scan 方法并创建我的计数器并将其设置为 0。我的 On Error 事件只记录。我遇到了 FileSystemWatcher 试图在文件上传之前打开文件的问题,因此我添加了睡眠。
最后,我正在使用 Microsoft Forefront 的命令行扫描程序。文件路径:C:\Program Files\Microsoft Security Client\mpcmdrun.exe。
如果有任何问题,请告诉我。
【讨论】:
哦忘了,我记录了失败的代码 (2) 和实际的失败。失败代码用作 SQL 中的标志。我使用实际的失败来弄清楚发生了什么。在 Forefront 中,0 是通过,2 是失败,我认为是 5 是未知的。当文件在上传之前打开或刚刚消失时,会发生未知情况。以上是关于病毒扫描后以编程方式移动文件的主要内容,如果未能解决你的问题,请参考以下文章