2015-10-28 29 views
7

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.)

を誰かがそれを持っている場合、可能な解決策を知りたい。

+1

_ "プロセスは終了コードを返す" _です - ちょうど[プロセスの出力を読む](http://stackoverflow.com/questions/4291912/process-start出力を取得する) – CodeCaster

+0

IIS経由で実行するとプロセスの出力は空白ですが、ローカルコードから実行すると正しく出力されます。 – anothershrubery

+2

設定したIISユーザーには、Sophosパスに対する管理者権限も必要です。私は組み込みのIISを使用せず、sysadminにこのタスクに使用できるサービスアカウントを作成させることをお勧めします – Ian

答えて

1

あなたはIIS内で.NETアプリケーションを実行しているアプリケーションプールは、あなたのファイル

「Cに実行権限を持っていることを確認する必要があります:\プログラムファイル(x86)\ Sophos \ Sophos Anti-Virus \ sav32cli.exe "

また、このpermissiを追加する必要があります

IIS8が管理者として実行されないため、ウイルス対策スキャンを実行するには、管理者権限が必要な場合もあります(c:\ temp)。あなたがデバッグしているときは、Visual Studioはあなたの現在のログインしているWindowsユーザー(あなたがrunasを使用していない限り)を使用するので、デバッグ時にこれが動作する理由を説明します。

+0

いいえ - プロセスを実行できなかった場合、そのプロセスに固有のエラーコードが得られませんでした。 – nothingisnecessary

+0

私の答えは、実際のスキャンプロセスと、起動時にスキャンを完了するのに十分な権限があることを確認することです。もし、アンチウィルスがアクセス権を持っていなかったなら、私はそのリターンがアンチウィルスアプリケーションからの実行を停止したと期待していました。実行許可部分は、「この種の実装のベストプラクティスは何ですか?」と明確に答えて回答することです。 – Mallek

0

スキャン対象のコンテンツ(uploadsフォルダ)にアクセス許可が正しく設定されていないか、ワーカープロセスユーザーがSophosを使用するために必要な完全なアクセス許可を持っていない可能性があります。 Sophos固有の終了コードとエラーメッセージが表示されているため、実行可能ファイル自体にワーカープロセスからアクセスできることがわかります。

プロセスでは脅威と認識されるファイルが削除されるため、アップロードされたファイルを格納するフォルダに対してプロセスmodifyまたはfull controlのアクセス許可を与えるユーザーに許可する必要があります。

ApplicationPoolIdentityプロセスにはデフォルトでIIS_IUSRSグループを使用できますが、IISマネージャー>アプリケーションプール>詳細でユーザーを確認(および変更)できます。ここで

This answer has more details

0

いくつかのアイデアです:

  1. 一度ログイン、前回の提案が失敗した場合、参照start-a-net-process-as-a-different-user
  2. を参照、フォルダに昇格した権限を持つ別のユーザーを使用してプロセスを作成します。ポイント1で使用されている資格情報を使用してサーバー上で実行されます。ユーザープロファイルに接続されているレジストリエントリを構成します。
  3. サーバー上で実行している単純な.netサービスを開発し、アップロードフォルダを監視します。このサービスは、Sophosスキャンを成功させる確率が高くなります。ここに参考文献はservice creation using .netです。
  4. サービスは、DB /ファイルシステム/ etcを使用してWebページとやりとりすることもあります。操作は同期的に見えるかもしれません。

これらは、私の4セント:-)

関連する問題