トップ回答者
ASPクラシックとASP.NETの共存環境でサーバ上のファイルが削除できない。

質問
-
ASPクラシックとASP.NETの共存環境でサーバ上のファイルが削除できない。ユーザがローカルディスクからファイルを選択してサーバにアップロードできて、そのファイルを一覧表示・ダウンロード・削除できるサイトを作成しています。
当初ASP(JScript)とBASP21で、以前に作ったプログラムがあって、それをアップしました。ところが、PDFをアップロードしようとするとvar counter = Request.TotalBytes;
var BR = Request.BinaryRead(counter);のRequest.BinaryReadで必ずエラーになるのです。他のワードファイル、画像などは問題ないので多分バグなのだろうと考えました。またダウンロードの際も、PDFだけうまく処理できないのです。そこで仕方がないので、アップロードとダウンロードのプログラムだけ.NET(C#)で作り直して、うまく動くようになりました。
アップロードプログラムはこんな感じです。
<%@ Page Language="C#"%>
<%
HttpPostedFile posted = Request.Files["F1"];
string strsave = "";
if (posted.FileName != "")
{
strsave = "(サーバ上の物理パス)\\"
+ System.IO.Path.GetFileName(posted.FileName);
posted.SaveAs(strsave);
}
Response.Redirect("index.asp",true);
%>
ところが、今度は、ファイルが削除できなくなり、「書き込めません」というエラー表示がでるようになりました。
エラーコードは800A0046で権限の問題だとは思います。var Fobj = Server.CreateObject("Scripting.FileSystemObject");
Fobj.DeleteFile(DIRECTRY_NAME+"\\"+fName,true);改変をするまでは削除できていました。またローカルのVISTAの開発環境では削除できます。
2003サーバで、改変をして、GIF以外のファイルが削除できなくなり、最終的にはGIFも削除できなくなりました。
いろいろフォルダやIISのユーザ権限などの設定を見ているのですが、原因がわかりません。
ちなみに、.NETの削除プログラムも作ってみました。エラーコードまで確認していませんが、やはり削除できないようです。
ご存知の方がおいででしたら教えてください。
回答
-
> 1. 全部.NETにしてみる。
全部 ASP.NET の Web アプリに変更したと思っていましたが、問題の部分
が ASP のままだとすると、先の回答は見当違いだったかもしれません。FileSystemObject とかは自分はわかりませんが、ASP, FileSystemObject,
800A0046 をキーワードにググって見ると、ワーカープロセスのアクセス権
は関係ないような感じです。以下が該当していそうな感じがしますが、いかがですか?
ASP上でFileSystemObjectのDeleteFileがエラー
http://okwave.jp/qa/q2167938.htmlFileSystemObject でリモート ファイルにアクセスできない
http://support.microsoft.com/kb/197964> そもそもASPクラシックとBASP21ではPDFを除いて動いていたわけですか
> らね。そうですね。でも、上記のページを参考に、アクセス権の設定など試して
みてはいかがですか。- 回答としてマーク 山本春海 2011年3月30日 4:48
-
何かの足しになれば。。。
まず、IISマネージャで .NETウエブアプリのプロパティでディレクトリセキュリティを確認してください。「匿名アクセスにを有効にする」にチェックが入っている場合での
Classic ASP は 「匿名アクセスにを有効にする」に記述しているユーザー名でフォルダにアクセスします。デフォルトだと IUSR_コンピュータ名となり、ローカルグループでは
Guestsに所属されます。IIS_WPGやコンピュータ名_USERSに含まれません。
ファイルを削除するアプリを Classic ASP でコーディングしているならば、「IUSR_コンピュータ名」のアカウントで削除できるように、フォルダへ権限付与が必要です。ただ、匿名のアカウントで操作するので権限を付与するフォルダは最小限にしておくべきです。もし、イントラネットならばWindowsアカウントで制御するなどを試みることをお勧めします。
- 回答としてマーク 山本春海 2011年3月30日 4:48
すべての返信
-
> ASP.NETクライント(足しました)フルコントロール
それが具体的に何だか分かりませんが、ワーカープロセスのアカウントでしょうか?
Windows Server 2003 (IIS6) の場合、ワーカープロセスのアカウントはデフォルト
で NETOWRK SERVICE です。以下のコードで調べられるのでチェックしてみてくださ
い。System.Security.Principal.WindowsIdentity.GetCurrent().Name
デフォルト設定のままなら NT AUTHORITY\NETWORK SERVICE になるはずです。
その場合は NT AUTHORITY\NETOWRK SERVICE アカウントまたはそれが属するグループ
(Windows Server 2003 の場合は IIS_WPG のはず)に、問題のフォルダに対する必要
な権限を与えることで解決すると思います。 -
ご指摘ありがとうございました。
System.Security.Principal.WindowsIdentity.GetCurrent().NameはNT AUTHORITY\NETWORK SERVICEになりました。
NETWORK SERVICEあるいはIIS_WPGをフルコントロールにしても、状況は変わりませんでした。
ありがとうございます。根本的な解決ができればいいのですが、できないようであれば、このプログラムは私の裁量でなんとでもできるプログラムなので、- 全部.NETにしてみる。
- SQL SERVERのBLOBにいれる
などの方策を試してみたいと思います。運用が始まってしまうので・・・
だけど、おかしいのはおかしいですよね。そもそもASPクラシックとBASP21ではPDFを除いて動いていたわけですからね。 -
> 1. 全部.NETにしてみる。
全部 ASP.NET の Web アプリに変更したと思っていましたが、問題の部分
が ASP のままだとすると、先の回答は見当違いだったかもしれません。FileSystemObject とかは自分はわかりませんが、ASP, FileSystemObject,
800A0046 をキーワードにググって見ると、ワーカープロセスのアクセス権
は関係ないような感じです。以下が該当していそうな感じがしますが、いかがですか?
ASP上でFileSystemObjectのDeleteFileがエラー
http://okwave.jp/qa/q2167938.htmlFileSystemObject でリモート ファイルにアクセスできない
http://support.microsoft.com/kb/197964> そもそもASPクラシックとBASP21ではPDFを除いて動いていたわけですか
> らね。そうですね。でも、上記のページを参考に、アクセス権の設定など試して
みてはいかがですか。- 回答としてマーク 山本春海 2011年3月30日 4:48
-
何かの足しになれば。。。
まず、IISマネージャで .NETウエブアプリのプロパティでディレクトリセキュリティを確認してください。「匿名アクセスにを有効にする」にチェックが入っている場合での
Classic ASP は 「匿名アクセスにを有効にする」に記述しているユーザー名でフォルダにアクセスします。デフォルトだと IUSR_コンピュータ名となり、ローカルグループでは
Guestsに所属されます。IIS_WPGやコンピュータ名_USERSに含まれません。
ファイルを削除するアプリを Classic ASP でコーディングしているならば、「IUSR_コンピュータ名」のアカウントで削除できるように、フォルダへ権限付与が必要です。ただ、匿名のアカウントで操作するので権限を付与するフォルダは最小限にしておくべきです。もし、イントラネットならばWindowsアカウントで制御するなどを試みることをお勧めします。
- 回答としてマーク 山本春海 2011年3月30日 4:48