ASP.Net服务器上的进程无法通过IIS

时间:2015-10-28 12:45:25

标签: c# asp.net iis process antivirus

我正在尝试在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]         (可能没有足够的用户管理员权限。)

暂时我们将转向另一种病毒检查方法,但如果有人拥有它,我们仍然想知道可能的解决方案。

4 个答案:

答案 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>

ASP.NET Trust Levels and Policy Files

答案 2 :(得分:0)

很可能未对正在扫描的内容(uploads文件夹)正确配置权限,或者工作进程用户没有使用Sophos所需的完整权限。您知道可执行文件本身可由工作进程访问,因为您将获得特定于Sophos的退出代码和错误消息。

由于您的流程会删除被视为威胁的文件,因此您需要授予用户对存储上传文件的文件夹运行流程modifyfull control权限的权限。

默认情况下,您可以将IIS_IUSRS组用于ApplicationPoolIdentity进程,但您可以在IIS管理器中验证(和修改)用户&gt;应用程序池&gt;高级。

This answer has more details

答案 3 :(得分:0)

以下是一些想法:

  1. 使用具有提升的文件夹权限的其他用户创建流程,请参阅参考start-a-net-process-as-a-different-user
  2. 如果上一个建议失败,请使用第1点中使用的凭据在服务器上登录一次。它将配置连接到用户配置文件的注册表项,某些程序需要它。
  3. 开发在服务器上运行的简单.net服务并监控上传文件夹。该服务更有可能成功运行Sophos扫描。以下是service creation using .net的参考资料。
  4. 该服务还可以使用DB /文件系统/等与您的网页通信。因此操作可能看起来是同步的。
  5. 这是我的4美分:-)