ASP.Net Webアプリケーションでアップロードされたファイルに対してウイルス対策スキャンを実行しようとしています。私たちはソフォスを使用しているので、コマンドラインAPI sav32cli
にアクセスできます。私が使用するコードでは:コードをステップ実行するときのdevのサーバー上w3wp
プロセスに接続するときASP.Netサーバー上のプロセスがIIS上で正しく動作しない
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;
、コードだけで、すべての次の一見何もしない1つのラインからジャンプします。 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" />
欠けているものがありますか?この種の実装のベストプラクティスは何ですか?
EDIT:呼び出されたとき、Process
はむしろ予想0(スキャンが働いて、無ウイルス)、または3(見出さスキャンが働いて、ウイルス)よりも、(エラーが実行を停止)2のExitCode
を返します。
EDIT 2:コメントを1として私は、コードを変更下回っ:
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上で実行したときに常に空ですが、コードから実行するときに正しく読み込まれます。
EDIT 3:代わりにStandardOutput
を見ていると私たちはStandardError
を見て、それがこのエラーを明らかにした:我々は、ウイルスチェックの別の方法に移動しようとし、それでも希望している当面
Error initialising detection engine [0xa0040200] (Possible insufficient user Admin rights.)
を誰かがそれを持っている場合、可能な解決策を知りたい。
_ "プロセスは終了コードを返す" _です - ちょうど[プロセスの出力を読む](http://stackoverflow.com/questions/4291912/process-start出力を取得する) – CodeCaster
IIS経由で実行するとプロセスの出力は空白ですが、ローカルコードから実行すると正しく出力されます。 – anothershrubery
設定したIISユーザーには、Sophosパスに対する管理者権限も必要です。私は組み込みのIISを使用せず、sysadminにこのタスクに使用できるサービスアカウントを作成させることをお勧めします – Ian