2011-08-15 1 views
0

ウイルススキャンの状態に基づいてファイルをプログラムで移動することはできますか?私が何をしたいかウイルススキャン後にファイルをプログラムで移動する

は、フォルダのセット持っている:

着信を スキャン/クリーンスキャン スキャン/感染

は、ファイルの受信フォルダにドロップされます

スキャンされません。その時点で、私はウイルス対策ソフトを起動し、受信フォルダ内のファイルをスキャンしたいと思います。完了したら、ファイルを適切なフォルダ(CleanまたはInfected)に移動する必要があります。何らかの理由でファイルをスキャンできなかった場合、スキャンできなかった場合は、スキャンされていないフォルダに移動さ​​れます。

これをスクリプト化する方法があると私は望んでいました。誰もこれまでにこのようなことをやったことがありますか?

+0

もちろん、可能です。何でも可能です。しかし、これは非常に広い質問です。使用しているAVや実行中の環境を指定していないので、有用な答えを得ることはまずありません。 – Jason

+0

この時点で...何か。私はウイルス対策は気にせず、シンプルなWindows環境です。ファイルは、Windows Server 2003サーバー上のPOSTによって削除されます。私が無料のウイルス対策ソフトをダウンロードしなければならないなら、私はそうするでしょう。記録のために、サーバーはSymantecを実行します。 – Matt

+0

これはおそらく、スーパーユーザーの質問として、「どのAVがフォルダXを監視し、感染したファイルをフォルダYに移動するのを許可するのですか?」 – Jason

答えて

0
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では、私のスキャンメソッドを実行してカウンタを作成し、それを0に設定するメソッドがあります。My On Errorイベントだけがログに記録されます。 FileSystemWatcherがアップロードされる前にファイルを開こうとしていたので、なぜ睡眠を追加したのかという問題がありました。

最後に、Microsoft Forefrontのコマンドラインスキャナを使用しています。ファイルパス:C:¥Program Files¥Microsoft Security Client¥mpcmdrun.exe。

質問があれば教えてください。

+0

忘れてしまった、私は失敗したコード(2)と実際の失敗を記録する。障害コードはSQLのフラグとして使用されます。実際の失敗は、私が何が起こっているのかを理解するために使用されます。 Forefrontでは、0は合格、2は失敗、5は不明です。ファイルがアップロードされる前、またはファイルがなくなると、ファイルが開かれたときに不明な状態が発生します。 – Matt

関連する問題