トップ回答者
Windows Server IIS環境で他サーバのフォルダを参照したい

質問
-
サーバ 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
回答
-
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
すべての返信
-
サーバー 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 誤字訂正
-
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
-
SurferOnWww様、KOZ6.0様、回答、ありがとうございます。
ご教示いただいたように、結論はリンク先HP:「アプリケーション プール ID」の「ネットワークへのアクセス」で解決できました。
下記の手順で行いました。
①サーバBで、参照させたいフォルルダのプロパティで、[セキュリティ]-[編集]で
ドメイン/マシン名
で追加する
②上記①と同じくォルルダのプロパティで、[共有]タブの共有ボタンを押して
上記①で追加したドメイン/マシン名を選択して、「アクセス許可レベル」を設定して下段の「共有ボタン」を押す。私の設定方法が適切でなかったのかもしれませんが、上記②を行わないフォルダは参照できませんした。
(ここで少しハマッテしまいました)なお、各ユーザには、「ネットワークドライブ」を運用上、割り当てています。
また、ユーザ画面では、割り当てたドライブをみて操作等します。
よって、asp.net core MVC 上の処理は、フロントは「割り当てたドライブ」ですが、
DirectoryInfo等使用するときは、「割り当てたドライブ」にUNCに読み替えました。ありがとうございました。