C# ASP.Net服务器上的进程未在IIS上正确运行
我正在尝试对ASP.Net web应用程序中上载的文件运行防病毒扫描。我们正在使用Sophos,因此可以访问其命令行APIC# 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
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>