C# ASP.Net服务器上的进程未在IIS上正确运行

C# ASP.Net服务器上的进程未在IIS上正确运行,c#,asp.net,iis,process,antivirus,C#,Asp.net,Iis,Process,Antivirus,我正在尝试对ASP.Net web应用程序中上载的文件运行防病毒扫描。我们正在使用Sophos,因此可以访问其命令行APIsav32cli。在我使用的代码中: Process proc = new Process(); proc.StartInfo.FileName = @"C:\Program Files (x86)\Sophos\Sophos Anti-Virus\sav32cli.exe"; proc.StartInfo.Arguments = @"-remove -nc " + Save

我正在尝试对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;
当单步执行代码时,当连接到dev服务器上的
w3wp
进程时,代码只是从一行跳到下一行,似乎什么也不做。当从dev服务器上的代码运行时,它按预期执行扫描文件和删除(如果被视为病毒)

服务器正在运行IIS 8.0,应用程序内置在.Net Framework 4中。我已经根据这些说明更改了机器配置,以允许进程作为系统帐户运行

输出
在IIS上运行时始终为空,但在从代码运行时正确填充

编辑3:我们没有查看
StandardOutput
,而是查看了
StandardError
,发现了以下错误:

初始化检测引擎[0xa0040200]时出错 (可能是用户管理权限不足。)


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

您是否尝试过以更高的信任度运行您的web进程



您需要确保在IIS中运行.NET应用程序的应用程序池对您的文件具有执行权限

“C:\Program Files(x86)\Sophos\Sophos Anti-Virus\sav32cli.exe”

例如,您可能还需要将此权限添加到上载要扫描的文件的文件夹位置(c:\temp)


由于IIS8不是以管理员身份运行,因此您可能还需要具有管理员权限才能运行防病毒扫描。调试时,visual studio使用当前登录的windows用户(除非您使用runas),因此这将解释为什么调试时它会工作。

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

由于您的进程将删除被视为威胁的文件,因此您需要授予运行进程的用户对存储上载文件的文件夹的
修改
完全控制
权限

默认情况下,您可以为
ApplicationPoolIdentity
进程使用
IIS\u IUSRS
组,但您可以在IIS管理器>应用程序池>高级中验证(和修改)用户

以下是一些想法:

  • 使用对文件夹具有提升权限的其他用户创建进程,请参阅以获取参考
  • 如果前面的建议失败,请使用第1点中使用的凭据在服务器上登录一次。它将配置连接到用户配置文件的注册表项,有些程序需要它
  • 开发一个在服务器上运行并监视上载文件夹的简单.net服务。该服务更有可能成功运行Sophos扫描。这里有一个关于的参考资料
  • 该服务还可以使用DB/file system/等与您的网页进行对话。。因此,操作可能看起来是同步的

  • 这是我的4美分:-)

    “进程返回一个ExitCode”-只是…进程的输出在通过IIS运行时为空,但在从本地代码运行时正确填充。您设置的IIS用户还需要Sophos path的管理员权限。我建议不要使用任何IIS内置用户,让系统管理员创建一个可用于此任务的服务帐户第一个问题:服务环境中是否支持sophos。他们支持这个配置吗?无论如何,您可以编写一个小型自定义网关Windows服务,该服务运行时具有足够的权限,可用于此sophos exe。然后,您可以使用更简单的方法(如HTTP/REST/WCF/Remoting等)从IIS与此服务进行通信。因此,在IIS和此服务之间不需要特殊权限。通常,此类错误可以通过使用来解决。它可以跟踪您启动的
    sav32cli.exe
    进程的所有文件/注册表/进程/网络活动。您将看到哪些请求失败。你能创建跟踪吗?不-如果它不能执行该进程,他就不会得到该进程特定的错误代码。我的回答是实际的扫描进程,并确保应用程序在启动时有足够的权限完成扫描。如果反病毒程序没有权限,我希望返回错误会停止反病毒程序的执行。“执行权限”部分旨在澄清并帮助回答“这种实现的最佳实践是什么?”
    <processModel  userName="SYSTEM" password="AutoGenerate" />
    
    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();
    
    <system.web>
      <securityPolicy>
        <trustLevel name="Full" policyFile="internal"/>
      </securityPolicy>
    </system.web>