ASP.NET Core アプリケーションから他サーバーの共有フォルダにアクセスする (IIS, アプリケーションプール設定版)

Siden oppdatert :
ページ作成日 :

動作検証環境

Visual Studio
  • Visual Studio 2022
ASP.NET Core
  • 6 (Razpr Pages)
Windows Server
  • 2022 (ASP.NET Core 動作環境)
  • 2019 (共有フォルダ配置サーバー)
IIS
  • 10.0

動作環境

すべてで検証したわけではありませんが概ね動作するはずです。

Visual Studio
  • ASP.NET または ASP.NET Core プロジェクトを開発できるならなんでも
ASP.NET Core
  • いずれのバージョンでも可 (MVC, Razor Pages, API 問わず)
ASP.NET
  • いずれのバージョンでも可
Windows Server
  • Windows Server 2008 以降
IIS
  • 7.0 以降

前提条件

  • ASP.NET Core アプリケーションは IIS 上で動かすこと前提としています。他の Web サーバーでは本 Tips の内容を実施することは出来ません

環境

以下のような環境で検証しています。

PC・サーバー 使用目的
Windows 11 (ローカル) プログラムを開発するための環境。今回の目的とは無関係
SV2022Test IIS と ASP.NET Core を動かす環境。ここから SV2019Test の共有フォルダにアクセス
SV2019Test 共有フォルダをもつサーバー

また、各種設定は以下のようにします。

パラメータ名
アクセスユーザー名 SharedUser
共有フォルダ名 SharedFolder

ASP.NET Core アプリケーションから共有フォルダのファイル読み込み・書き込みをするプログラムを作る

サンプルとしては単純にボタンをクリックしたら、

  • 共有フォルダのファイルを読み込んで画面に表示する
  • 共有フォルダに新しいファイルを書き込む

の処理をさせます。

まだ共有フォルダを作成したりしていないのでデバッグ実行はできませんが、簡単なコードなのでとりあえずプログラムだけ作ってしまいます。

ASP.NET Core のプロジェクトの種類はなんでもよいですが、今回は Razor Pages で作成しています。

Index.cshtml.cs を開き、ボタンをクリックしたときの処理を追加します。 サーバー名は直接記述していますが、実際の運用ではうまく調整して下さい。 共有フォルダにアクセスできない場合もあるので try-catch で囲んでいます。

public class IndexModel : PageModel
{
  // 省略

  public void OnGet() { }

  // ここから追加
  public void OnPost()
  {
    var serverName = "SV2019Test";
    try
    {
      var readFilePath = $@"\\{serverName}\SharedFolder\Input.txt";
      var writeFilePath = $@"\\{serverName}\SharedFolder\Output.txt";

      // 共有フォルダからファイルを読み込む
      var text = System.IO.File.ReadAllText(readFilePath);

      // 別ファイルとして共有フォルダに書き込む
      System.IO.File.WriteAllText(writeFilePath, text);

      // 読み込んだ内容を画面に表示する
      ViewData["Message"] = text;
    }
    catch (Exception ex)
    {
      ViewData["Message"] = ex;
    }
  }
  // ここまで追加
}

Index.cshtml にはボタンとメッセージを配置します。

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

@* ここから追加 *@
<form method="post">
  <button type="submit">処理実行</button>
</form>
<div>@ViewData["Message"]</div>
@* ここまで追加 *@

プログラムを作成したらサーバーに配置するためのファイルを作成します。 今回は発行したファイルを直接配置する方法を使用しますがどの方法で配置しても問題ありません。 また、プログラムの配置については本 Tips の本質ではないので簡略して掲載しています。

発行設定を追加します。

設定を変更します。

図のように設定を変更しています。こちらも今回の目的とは特に関係ないので環境に合わせて設定してください。

プログラムを発行します。

プログラムを発行したら「ターゲットの場所」のリンクをクリックすると配置するファイルのあるフォルダが開きます。

共有フォルダサーバーの構築

ユーザーの作成

通常、サーバーが別であれば各サーバーに作成したユーザーも内部的にはまったく別ユーザーとして扱われるのですが、 「同じユーザー名」「同じパスワード」で作成することにより別サーバーへの Windows 認証を省略することができます。 これを利用して今回は別サーバーの共有フォルダにアクセスします。

ちなみに Active Directory などのドメインでサーバーやアカウントを扱っている場合はそのアカウントで両サーバーを設定すればいいのである程度は設定は簡略化されます。

ユーザーの作成手順は特に詳しくは説明しません。

今回は SharedUser という名前で作成します。 このユーザーで画面を操作したり設定を変えることはないのでパスワードは変更できないようにしています。

デフォルトのままだとこのユーザーでリモートデスクトップなどでログイン出来てしまうのでグループから Users を削除してください。

共有フォルダの作成

作成する場所はどこでも構いません。他サーバーからすれば物理フォルダの場所は意識しないからです。 今回は C ドライブの直下に SharedFolder という名前でフォルダを作成してそこを共有します。

プロパティを開いて共有設定を行います。

共有フォルダ名は SharedFolder にします。この名前が他サーバーから見える名前になります。 アクセス許可で SharedUser を追加してください。

既存の Everyone は削除します。

「変更」権限をつけて確定します。

あくまでも外からアクセスできる権限を付けただけなので、内部的に SharedUser がこのフォルダ内を操作できるように設定します。

「変更」権限をつけて確定します。

動作確認用にファイルを作成しておきます。

他の PC からエクスプローラーで \\<サーバー名>\ にアクセスし、SharedUser でログインしてファイルが見れれば OK です。

アプリケーションサーバーの構築

IIS のインストール

とりあえずサーバーマネージャーからデフォルトでインストールしてください。手順の詳細は省きます。

追加機能は不要です。

IIS の追加サービスは今回不要です。

ASP.NET Core ランタイム Hosting Bundle インストール

今回 ASP.NET Core 6 を使用しているのでそれに合わせたランタイムのインストールが必要です。以下の URL からダウンロードします。

ASP.NET Core を IIS で動かすには「Hosting Bundle」というものが必要です。 ASP.NET Core ランタイム から「Hosting Bundle」をダウンロードしてください。

ダウンロードしたらサーバー上で実行します。

ウィザードに沿ってインストールしてください。

Web アプリケーションの作成と配置

Windows 管理ツールから「インターネット インフォメーション サービス (IIS) マネージャー」を開きます。

「Default Web Site」をそのまま使ってもいいですが、今回は新しくサイトを作成します。 Default Web Site は自動で起動されているので停止しておいてください。

新しく Web サイトを作成します。

今回サイト名は SharedFolderAccess にしていますがなんでもいいです。

アプリケーション プールは新しいサイトに合わせて自動生成されたものを使用します。

プログラムを配置するフォルダを任意に作成して指定してください。

80 番ポートは「Default Web Site」と被っているので警告が表示されますがすでに停止しているなら無視して構いません。

作成されました。

Web サイトで指定したフォルダをエクスプローラーで開き、発行したプログラムをそのまま全てコピーして配置します。

IIS のリンクからページを開いて画面が表示されるか確認します。 Web ブラウザを先に開いて直接 URL を入力しても構いません。

ちなみにこの状態でボタンをクリックしてもまだ権限設定が終わってないのでエラーになります。

ユーザーの作成

共有フォルダサーバーと同じユーザー SharedUser をアプリケーションサーバーにも作成します。パスワードも一致させてください。手順は全く同じです。

アプリケーション プールの権限を変更

Web プログラムによるアクセス権限は「アプリケーション プール」によって決まっており、 デフォルトでは Web アプリケーションを動かす程度の権限しかない ApplicationPoolIdentity になっています。

この権限を SharedUser に変更することにより Web プログラムは設定したユーザーの権限で処理を動かすことができます。 そのため Web プログラムは SharedUser で共有フォルダにアクセスできるようになるのです。

IIS マネージャーを開いたら「アプリケーション プール」を選択します。

Web サイト作成時に自動で追加された SharedFolderAccess があるので右クリックして「詳細設定」を選択します。

プロセスモデルに「ID」があるので右のボタンをクリックします。

「カスタム アカウント」を選択し「設定」ボタンをクリックします。

SharedUser のユーザー名とパスワードを入力し確定します。

動作確認

Web ページにアクセスしてボタンをクリックしてください。テキストファイルの内容が表示されれば成功です。

共有フォルダの中に新しいファイルができていることも確認してください。