病毒扫描后以编程方式移动文件

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 是未知的。当文件在上传之前打开或刚刚消失时,会发生未知情况。

以上是关于病毒扫描后以编程方式移动文件的主要内容,如果未能解决你的问题,请参考以下文章

勒索病毒通过哪个端口传播

iOS - 从 XIB 文件中引用和以编程方式移动视图

几种攻击手段

如何在设备旋转后以编程方式创建的 UIButtons 保持在屏幕底部?

硬盘中病毒了.求助!!

滚动条自动上下滚,如何解决?