【问题标题】:Process on ASP.Net server not running correctly over IISASP.Net 服务器上的进程未在 IIS 上正确运行
【发布时间】:2016-01-28 05:58:31
【问题描述】:

我正在尝试对 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();

output 在 IIS 上运行时始终为空,但从代码运行时会正确填充。

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

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

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

【问题讨论】:

  • “进程返回一个 ExitCode” - 只是 read the process's output...
  • 进程通过 IIS 运行时输出为空白,但从本地代码运行时正确填充。
  • 您设置的 IIS 用户还需要 Sophos 路径的管理员权限。我建议不要使用任何 IIS 内置用户,并让系统管理员创建一个可用于此任务的服务帐户
  • 第一个问题:在服务环境中是否支持sophos。他们支持这个配置吗?无论如何,您可以编写一个小的自定义网关 Windows 服务,该服务以足够的权限运行,可以与这个 sophos exe 一起使用。然后,您可以使用更简单的方法(例如 HTTP/REST/WCF/Remoting 等)从 IIS 与该服务进行通信,因此不需要 IIS 和该服务之间的特殊权限。
  • 通常这种错误可以通过使用Process Monitor来解决。它可以跟踪您启动的sav32cli.exe 进程的所有文件/注册表/进程/网络活动。您将看到哪些请求失败。你能创建痕迹吗?

标签: c# asp.net iis process antivirus


【解决方案1】:

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

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

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

您可能还需要具有管理员权限才能运行防病毒扫描,因为 IIS8 不以管理员身份运行。当您调试时,Visual Studio 使用您当前登录的 Windows 用户(除非您使用 runas),所以这将解释为什么它在调试时会起作用。

【讨论】:

  • 否 - 如果它无法执行该进程,他将不会收到特定于该进程的错误代码。
  • 我的回答是关于实际的扫描过程,并确保应用程序在启动时有足够的权限来完成扫描。如果防病毒没有权限,我希望从防病毒应用程序返回错误停止执行。执行权限部分是为了澄清和帮助回答“这种实现的最佳实践是什么?”
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    This answer has more details

    【讨论】:

      【解决方案4】:

      这里有一些想法:

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

      这是我的 4 美分 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2017-06-15
        • 2016-05-06
        • 2017-10-20
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多