我正在尝试在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
进程时,代码只会从一行跳到下一行似乎什么都不做。从dev服务器上的代码运行时,它会执行预期的扫描文件,如果被视为病毒则会删除。
服务器正在运行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
返回ExitCode
为2(错误停止执行),而不是预期的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 :我们没有查看StandardOutput
,而是查看了StandardError
,并发现了此错误:
初始化检测引擎时出错[0xa0040200] (可能没有足够的用户管理员权限。)
暂时我们将转向另一种病毒检查方法,但如果有人拥有它,我们仍然想知道可能的解决方案。
答案 0 :(得分:1)
您需要确保在IIS中运行.NET应用程序的应用程序池对您的文件具有执行权限
“C:\ Program Files(x86)\ Sophos \ Sophos Anti-Virus \ sav32cli.exe”
您可能还需要将此权限添加到上传要扫描的文件的文件夹位置(例如c:\ temp)
由于IIS8不以管理员身份运行,因此您可能还需要具有管理员权限才能运行反病毒扫描。在调试时,visual studio使用当前登录的windows用户(除非你使用runas),这样就解释了为什么它在调试时会起作用。
答案 1 :(得分:0)
您是否尝试过提升信任度来运行网络流程?
Configuring .NET Trust Levels in IIS 7
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal"/>
</securityPolicy>
</system.web>
答案 2 :(得分:0)
很可能未对正在扫描的内容(uploads
文件夹)正确配置权限,或者工作进程用户没有使用Sophos所需的完整权限。您知道可执行文件本身可由工作进程访问,因为您将获得特定于Sophos的退出代码和错误消息。
由于您的流程会删除被视为威胁的文件,因此您需要授予用户对存储上传文件的文件夹运行流程modify
或full control
权限的权限。
默认情况下,您可以将IIS_IUSRS
组用于ApplicationPoolIdentity
进程,但您可以在IIS管理器中验证(和修改)用户&gt;应用程序池&gt;高级。
答案 3 :(得分:0)
以下是一些想法:
这是我的4美分:-)