Процесс на сервере ASP.Net не работает правильно через IIS
Я пытаюсь запустить антивирусную проверку загруженного файла в веб-приложении ASP.Net. Мы используем 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, код просто переходит с одной строки на другую, казалось бы, ничего не делая. При запуске из кода на сервере dev он выполняет ожидаемый файл сканирования и удаляет его, если он рассматривается как вирус.
Сервер работает под управлением IIS 8.0, а приложение встроено в.Net Framework 4. Я изменил конфигурацию компьютера, чтобы процесс мог запускаться как учетная запись SYSTEM в соответствии с этими инструкциями. https://support.microsoft.com/en-us/kb/317012
<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();
output
всегда пуст при запуске через IIS, но заполняется правильно при запуске из кода.
РЕДАКТИРОВАТЬ 3: вместо того, чтобы смотреть на StandardOutput
мы смотрели на StandardError
и это выявило эту ошибку:
Ошибка инициализации механизма обнаружения [0xa0040200] (возможно, недостаточно прав пользователя Admin.)
В настоящее время мы собираемся перейти к другому методу проверки на вирусы, но все же хотели бы узнать возможное решение, если у кого-то оно есть.
4 ответа
Вам необходимо убедиться, что пул приложений, в котором выполняется приложение.NET внутри IIS, имеет разрешения на выполнение для вашего файла.
"C:\Program Files (x86)\Sophos\Sophos Anti-Virus\sav32cli.exe"
Вам также может понадобиться добавить это разрешение в папку, в которую загружается файл для сканирования (например, c:\temp)
Вам также может потребоваться иметь права администратора для запуска антивирусной проверки, поскольку IIS8 не запускается от имени администратора. Когда вы отлаживаете, Visual Studio использует вашего текущего зарегистрированного пользователя Windows (если вы не используете runas), поэтому это объяснит, почему это будет работать при отладке.
Вы пытались запустить ваш веб-процесс с повышенным доверием?
Настройка уровней доверия.NET в IIS 7
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal"/>
</securityPolicy>
</system.web>
Вот несколько идей:
- Создайте процесс, используя другого пользователя с повышенными привилегиями в папке, см. Справочник /questions/22530743/zapustitenet-protsess-kak-drugoj-polzovatel
- Если предыдущее предложение не сработало, войдите на сервер один раз, используя учетные данные, использованные в пункте 1. Он настроит записи реестра, связанные с профилем пользователя, что требуется для некоторых программ.
- Разработайте простой сервис.net, работающий на сервере и контролирующий папку загрузки. Скорее всего, сервис успешно выполнит сканирование Sophos. Вот ссылка на создание сервиса с использованием.net.
- Служба также может взаимодействовать с вашей веб-страницей с использованием БД / файловой системы / и т. Д., Поэтому операция может показаться синхронной.
Это мои 4 цента:-)
Скорее всего, разрешения не настроены правильно для сканируемого содержимого (uploads
папку) или пользователь рабочего процесса не имеет полных прав, необходимых для использования Sophos. Вы знаете, что сам исполняемый файл доступен рабочему процессу, потому что вы получаете коды выхода и сообщения об ошибках, характерные для Sophos.
Поскольку ваш процесс будет удалять файлы, которые воспринимаются как угрозы, вы должны предоставить пользователю, выполняющему процесс modify
или же full control
разрешения на папки, в которых хранятся загруженные файлы.
По умолчанию вы можете использовать IIS_IUSRS
группа для ApplicationPoolIdentity
процессов, но вы можете проверить (и изменить) пользователя в IIS Manager > Пулы приложений> Дополнительно.