none
ASPクラシックとASP.NETの共存環境でサーバ上のファイルが削除できない。 RRS feed

  • 質問

  • 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の削除プログラムも作ってみました。エラーコードまで確認していませんが、やはり削除できないようです。
    ご存知の方がおいででしたら教えてください。
    2011年3月20日 18:22

回答

  • > 1. 全部.NETにしてみる。

    全部 ASP.NET の Web アプリに変更したと思っていましたが、問題の部分
    が ASP のままだとすると、先の回答は見当違いだったかもしれません。

    FileSystemObject とかは自分はわかりませんが、ASP, FileSystemObject,
    800A0046 をキーワードにググって見ると、ワーカープロセスのアクセス権
    は関係ないような感じです。

    以下が該当していそうな感じがしますが、いかがですか?

    ASP上でFileSystemObjectのDeleteFileがエラー
    http://okwave.jp/qa/q2167938.html

    FileSystemObject でリモート ファイルにアクセスできない
    http://support.microsoft.com/kb/197964

    > そもそもASPクラシックとBASP21ではPDFを除いて動いていたわけですか
    > らね。

    そうですね。でも、上記のページを参考に、アクセス権の設定など試して
    みてはいかがですか。

    • 回答としてマーク 山本春海 2011年3月30日 4:48
    2011年3月22日 12:53
  • 何かの足しになれば。。。

    まず、IISマネージャで .NETウエブアプリのプロパティでディレクトリセキュリティを確認してください。「匿名アクセスにを有効にする」にチェックが入っている場合での
    Classic ASP は 「匿名アクセスにを有効にする」に記述しているユーザー名でフォルダにアクセスします。デフォルトだと IUSR_コンピュータ名となり、ローカルグループでは
    Guestsに所属されます。IIS_WPGやコンピュータ名_USERSに含まれません。 
    ファイルを削除するアプリを Classic ASP でコーディングしているならば、「IUSR_コンピュータ名」のアカウントで削除できるように、フォルダへ権限付与が必要です。

    ただ、匿名のアカウントで操作するので権限を付与するフォルダは最小限にしておくべきです。もし、イントラネットならばWindowsアカウントで制御するなどを試みることをお勧めします。

    • 回答としてマーク 山本春海 2011年3月30日 4:48
    2011年3月23日 1:51

すべての返信

  • > いろいろフォルダやIISのユーザ権限などの設定を見ているのですが、原因がわかり
    > ません。

    ワーカープロセス(IIS ではなくて)のフォルダに対するアクセス権の設定はどうなっ
    ているのでしょうか?

    2011年3月20日 19:48
  • ご連絡ありがとうございます。

    Administrators フルコントロール
    CREATOR OWNER なし
    ASP.NETクライント(足しました)フルコントロール
    システム フルコントロール
    コンピュータ名_USERS 読み取りと実行、ファイルの一覧表示、読み取り

    としております。

    2011年3月21日 1:49
  • > 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 のはず)に、問題のフォルダに対する必要
    な権限を与えることで解決すると思います。

    2011年3月21日 6:14
  • ご指摘ありがとうございました。

    System.Security.Principal.WindowsIdentity.GetCurrent().NameはNT AUTHORITY\NETWORK SERVICEになりました。

    NETWORK SERVICEあるいはIIS_WPGをフルコントロールにしても、状況は変わりませんでした。

    ありがとうございます。根本的な解決ができればいいのですが、できないようであれば、このプログラムは私の裁量でなんとでもできるプログラムなので、

    1. 全部.NETにしてみる。
    2. SQL SERVERのBLOBにいれる

    などの方策を試してみたいと思います。運用が始まってしまうので・・・
    だけど、おかしいのはおかしいですよね。そもそもASPクラシックとBASP21ではPDFを除いて動いていたわけですからね。

    2011年3月22日 1:29
  • > 1. 全部.NETにしてみる。

    全部 ASP.NET の Web アプリに変更したと思っていましたが、問題の部分
    が ASP のままだとすると、先の回答は見当違いだったかもしれません。

    FileSystemObject とかは自分はわかりませんが、ASP, FileSystemObject,
    800A0046 をキーワードにググって見ると、ワーカープロセスのアクセス権
    は関係ないような感じです。

    以下が該当していそうな感じがしますが、いかがですか?

    ASP上でFileSystemObjectのDeleteFileがエラー
    http://okwave.jp/qa/q2167938.html

    FileSystemObject でリモート ファイルにアクセスできない
    http://support.microsoft.com/kb/197964

    > そもそもASPクラシックとBASP21ではPDFを除いて動いていたわけですか
    > らね。

    そうですね。でも、上記のページを参考に、アクセス権の設定など試して
    みてはいかがですか。

    • 回答としてマーク 山本春海 2011年3月30日 4:48
    2011年3月22日 12:53
  • 何かの足しになれば。。。

    まず、IISマネージャで .NETウエブアプリのプロパティでディレクトリセキュリティを確認してください。「匿名アクセスにを有効にする」にチェックが入っている場合での
    Classic ASP は 「匿名アクセスにを有効にする」に記述しているユーザー名でフォルダにアクセスします。デフォルトだと IUSR_コンピュータ名となり、ローカルグループでは
    Guestsに所属されます。IIS_WPGやコンピュータ名_USERSに含まれません。 
    ファイルを削除するアプリを Classic ASP でコーディングしているならば、「IUSR_コンピュータ名」のアカウントで削除できるように、フォルダへ権限付与が必要です。

    ただ、匿名のアカウントで操作するので権限を付与するフォルダは最小限にしておくべきです。もし、イントラネットならばWindowsアカウントで制御するなどを試みることをお勧めします。

    • 回答としてマーク 山本春海 2011年3月30日 4:48
    2011年3月23日 1:51
  • SurferOnWww様
    SayBad様

    ご指摘ありがとうございました。
    IUSR_コンピュータ名を加えて動きました。
    そのとおりでした。
    随分時間がたってしまってすみません。

    2011年3月29日 9:22