我正在尝试在ASP.Net Web应用程序上对上传的文件运行反病毒扫描。我们使用Sophos,因此可以访问其命令行API sav32cli
。在代码中,我使用:
Process proc = new Process();
proc.StartInfo.FileName = @"C:\Program Files (x86)\Sophos\Sophos Anti-Virus\sav32cli.exe";
proc.StartInfo.Arguments = @"-remove -nc " + SavedFile;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
int exitCode = proc.ExitCode;
当在开发服务器上附加到
w3wp
进程并逐步执行代码时,代码似乎只是从一行跳到另一行而没有任何实际操作。但是当从开发服务器上的代码运行时,它会按预期的方式扫描文件并在视为病毒时进行删除。该服务器正在运行IIS 8.0,并且应用程序构建在.NET Framework 4中。我已更改机器配置以允许该进程作为SYSTEM帐户运行,根据这些说明进行操作:https://support.microsoft.com/en-us/kb/317012#%2Fen-us%2Fkb%2F317012。
<processModel userName="SYSTEM" password="AutoGenerate" />
有什么我没有考虑到的吗?这种实现方式的最佳实践是什么?
编辑:调用时,Process
返回一个2(错误停止执行)的ExitCode
,而不是预期的0(扫描正常,未发现病毒)或3(扫描正常,发现病毒)。
编辑2:根据下面的评论,我更改了代码:
Process proc = new Process();
proc.StartInfo.FileName = @"C:\Program Files (x86)\Sophos\Sophos Anti-Virus\sav32cli.exe";
proc.StartInfo.Arguments = @"-remove -nc " + SavedFile;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
StringBuilder output = new StringBuilder();
while (!proc.StandardOutput.EndOfStream)
{
string line = proc.StandardOutput.ReadLine();
output.AppendLine(line);
}
proc.WaitForExit();
int exitCode = proc.ExitCode;
ASPxMemo2.Text = exitCode.ToString() + Environment.NewLine + output.ToString();
当在IIS上运行时,output
始终为空,但从代码中运行时正确地填充。
编辑3:我们查看了StandardError
而不是StandardOutput
,它显示了这个错误:
Error initialising detection engine [0xa0040200] (Possible insufficient user Admin rights.)
目前,我们将转向另一种病毒检测方法,但仍然希望知道可能的解决方案。
sav32cli.exe
进程的所有文件/注册表/进程/网络活动。您将看到哪些请求失败了。您能创建这些跟踪吗? - Oleg