none
Windows Server IIS環境で他サーバのフォルダを参照したい RRS feed

  • 質問

  • サーバ A 上で、IISを立てて、サーバBの一部のフォルダをサーバ A で「ネットワークドライブ割り当て」で、「Z ドライブ」に割り当てます。
    その「Z ドライブ」を、asp.net (core) mvc(Windows認証) のプログラム上でフォルダを参照(DirectoryInfo等使用)するプログラムを作成します。
    <環境:開発>では、参照できますが、<サーバ環境>では参照できません。
    「Z ドライブ」にアクセス権(セキュリティ)に、IUSR、IIS_IUSRSの権限も付与も試してみました。
    どのようしたらよいのでしょうか。
    以上、よろしくお願いいたします


    <環境:開発>
    Visusal Studio 2019
    asp.net core mvc
    .net core 3.1
    (.NET Framework 4.7.2も含む)

    <サーバ環境>
    Windows Server 2019
    .net core 3.1
    (.NET Framework 4.7.2も含む)
    IIS 10.0

    2020年5月4日 1:55

回答

  • KOZ6.0 さんのレスを見て気づいたのですが・・・

    > サーバ A 上で、IISを立てて、サーバBの一部のフォルダをサーバ A で「ネットワークドライブ割り当て」で、「Z ドライブ」に割り当てます。

    というのは、特定のユーザーのアカウントでサーバー A にログインして、そのユーザーが、以下の記事に書いてあるようなエクスプローラーの操作でサーバー A に「Z ドライブ」を作り、

    ネットワーク ドライブの割り当て
    https://support.microsoft.com/ja-jp/help/4026635/windows-map-a-network-drive

    > その「Z ドライブ」を、asp.net (core) mvc(Windows認証) のプログラム上でフォルダを参照(DirectoryInfo等使用)するプログラムを作成します。

    というのは、サーバ A の IIS に配置した ASP.NET Web アプリのプログラムで、例えば以下のようにしているということだったようですね。

    DirectoryInfo di = new DirectoryInfo(@"Z:\MyDir");

    開発環境では、Visual Studio でアプリを起動し IIS Express 上で動かしたのだと思いますが、その場合ワーカープロセスのアカウントは開発マシンにログインして Visual Studio を立ち上げたユーザーのアカウントになります。そのユーザーのアクセス権は問題なく「Z ドライブ」も見えるので動いたのでしょう。

    サーバ環境では、IIS のワーカープロセスのデフォルトのアカウントはアプリケーション プール ID となり(詳しくは以下の記事参照)、「Z ドライブ」を作ったユーザーではないので上のようなコードではアクセスできないはずです。

    アプリケーション プール ID
    https://docs.microsoft.com/ja-jp/previous-versions/ee886292(v=technet.10)


    なので、先の私のレスに書いたアクセス権を与えるだけではダメでした(アクセス権が必要なのは間違いないですが)。「ネットワークドライブ割り当て」という手段はやめて、UNC を使うことをお勧めします。



    • 編集済み SurferOnWww 2020年5月5日 1:48 追記
    • 回答としてマーク sun_sun_sun 2020年5月6日 8:50
    2020年5月5日 1:40

すべての返信

  • サーバー A とサーバー B の両方が Acrive Directory ドメイン環境に属しているなら、以下の記事の「ネットワークへのアクセス」を参考に、サーバー A のコンピューターアカウントにサーバー B の「Z ドライブ」に対する必要なアクセス権を与えみては?

    アプリケーション プール ID
    https://docs.microsoft.com/ja-jp/previous-versions/ee886292(v=technet.10)?redirectedfrom=MSDN


    • 編集済み SurferOnWww 2020年5月4日 4:49 誤字訂正
    2020年5月4日 2:46
  • ネットワークドライブは、ユーザーごとの設定なので、ドライブを割り当てたユーザーが見ているZドライブと、IIS の実行ユーザーが見ているZドライブは違う可能性があります。

    Application_Start あたりでネットワークドライブの割り当てを行うようにしてみてはいかがでしょう。

    UNC パスでアクセスするのが確実かと思います。

    2020年5月4日 14:57
  • KOZ6.0 さんのレスを見て気づいたのですが・・・

    > サーバ A 上で、IISを立てて、サーバBの一部のフォルダをサーバ A で「ネットワークドライブ割り当て」で、「Z ドライブ」に割り当てます。

    というのは、特定のユーザーのアカウントでサーバー A にログインして、そのユーザーが、以下の記事に書いてあるようなエクスプローラーの操作でサーバー A に「Z ドライブ」を作り、

    ネットワーク ドライブの割り当て
    https://support.microsoft.com/ja-jp/help/4026635/windows-map-a-network-drive

    > その「Z ドライブ」を、asp.net (core) mvc(Windows認証) のプログラム上でフォルダを参照(DirectoryInfo等使用)するプログラムを作成します。

    というのは、サーバ A の IIS に配置した ASP.NET Web アプリのプログラムで、例えば以下のようにしているということだったようですね。

    DirectoryInfo di = new DirectoryInfo(@"Z:\MyDir");

    開発環境では、Visual Studio でアプリを起動し IIS Express 上で動かしたのだと思いますが、その場合ワーカープロセスのアカウントは開発マシンにログインして Visual Studio を立ち上げたユーザーのアカウントになります。そのユーザーのアクセス権は問題なく「Z ドライブ」も見えるので動いたのでしょう。

    サーバ環境では、IIS のワーカープロセスのデフォルトのアカウントはアプリケーション プール ID となり(詳しくは以下の記事参照)、「Z ドライブ」を作ったユーザーではないので上のようなコードではアクセスできないはずです。

    アプリケーション プール ID
    https://docs.microsoft.com/ja-jp/previous-versions/ee886292(v=technet.10)


    なので、先の私のレスに書いたアクセス権を与えるだけではダメでした(アクセス権が必要なのは間違いないですが)。「ネットワークドライブ割り当て」という手段はやめて、UNC を使うことをお勧めします。



    • 編集済み SurferOnWww 2020年5月5日 1:48 追記
    • 回答としてマーク sun_sun_sun 2020年5月6日 8:50
    2020年5月5日 1:40
  • SurferOnWww様、KOZ6.0様、回答、ありがとうございます。

    ご教示いただいたように、結論はリンク先HP:「アプリケーション プール ID」の「ネットワークへのアクセス」で解決できました。

    下記の手順で行いました。
    ①サーバBで、参照させたいフォルルダのプロパティで、[セキュリティ]-[編集]で
      ドメイン/マシン名
    で追加する
    ②上記①と同じくォルルダのプロパティで、[共有]タブの共有ボタンを押して
     上記①で追加したドメイン/マシン名を選択して、「アクセス許可レベル」を設定して下段の「共有ボタン」を押す。

    私の設定方法が適切でなかったのかもしれませんが、上記②を行わないフォルダは参照できませんした。
    (ここで少しハマッテしまいました)

    なお、各ユーザには、「ネットワークドライブ」を運用上、割り当てています。
    また、ユーザ画面では、割り当てたドライブをみて操作等します。
    よって、asp.net core MVC 上の処理は、フロントは「割り当てたドライブ」ですが、
    DirectoryInfo等使用するときは、「割り当てたドライブ」にUNCに読み替えました。

    ありがとうございました。

    2020年5月6日 8:50